nginx返回301删除一些参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx返回301删除一些参数相关的知识,希望对你有一定的参考价值。
我正在尝试使用nginx返回301删除一些参数。
例如,我想要像这样重定向的URL:
https://www.example.com/one?wanted=1&unwanted1=1
- > https://www.example.com/one?wanted=1
https://www.example.com/one?unwanted1=1
- > https://www.example.com/one
https://www.example.com/one?unwanted1=1&unwanted2=2&unwanted3=3
- > https://www.example.com/one
...等等
我用这段代码做了一些实验(注意它使用重写而不是返回):
if ($request_uri ~ "([^?]*)?(.*)unwanted=([^&]*)&?(.*)") {
set $args $2$4;
rewrite "^" $scheme://$host$uri permanent;
}
当仅存在一个不需要的参数时,这很有效。
我试图为每个参数重复它,但现在它不能以最佳方式工作,因为它会执行多个重定向,并且在不再需要时不会清除“&”(只剩下一个arg)。
...而且 - 我更愿意使用return 301而不是重写,因为我知道在这种情况下它将是首选方式。试图调整最后一行返回301,但它对我没有用。
任何想法我怎么能正确地完成这个?
要以不确定的顺序删除多个不需要的参数,您需要使用某种形式的递归。您的问题包含一个使用外部重定向循环的示例,但遭遇不需要的边缘情况。
留下尾随?
和&
的边缘情况可以使用多个if...return
块清除。
例如:
if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*$ ) {
return 301 $uri;
}
if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*(?:&(.*))?$ ) {
return 301 $uri?$1;
}
if ($args ~ ^(.*)&(?:unwanted1|unwanted2)=[^&]*(&.*)?$ ) {
return 301 $uri?$1$2;
}
上面的工作是通过处理两个案例,当尾随?
或尾随&
发生,分别与特制的return
声明。
以上通过使用外部重定向循环来工作。
nginx
也可以执行内部重定向,实现此目的的一种方法是使用rewrite...last
块中的location
。
在这种情况下的限制是找到将处理受不需要的参数影响的URI集的位置块。在下面的示例中,我使用location /
块,但您的要求将受到配置中的其他location
块和受影响的URI集的影响。
虽然你已经明确地成功分配了内部$args
变量,但我的答案避免了这种技术。
以下示例使用rewrite...last
重新实现前一个示例,并添加第四个if
块来执行实际的return 301
。
location / {
if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*$ ) {
rewrite ^ $uri? last;
}
if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*(?:&(.*))?$ ) {
rewrite ^ $uri?$1? last;
}
if ($args ~ ^(.*)&(?:unwanted1|unwanted2)=[^&]*(&.*)?$ ) {
rewrite ^ $uri?$1$2? last;
}
if ($request_uri ~ ?(.*&)?(unwanted1|unwanted2)= ) {
return 301 $uri$is_args$args;
}
try_files $uri $uri/ =404;
}
请注意,该示例仅使用if
中指示的this document块中的允许语句。
以上是关于nginx返回301删除一些参数的主要内容,如果未能解决你的问题,请参考以下文章