Redirect nginx return 301删除一些参数

Redirect nginx return 301删除一些参数,redirect,nginx,http-status-code-301,Redirect,Nginx,Http Status Code 301,我正在尝试使用nginx return301删除一些参数 例如,我希望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

我正在尝试使用nginx return301删除一些参数

例如,我希望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

……等等

我用这段代码做了一些实验(注意它使用重写而不是返回):

当只存在一个不需要的参数时,这种方法效果很好

我尝试对每个参数重复它,但现在它不能以最佳方式工作,因为它执行多个重定向,并且不再需要时不会清理“&”(只剩下一个参数)

…此外-我更喜欢使用return301而不是rewrite,因为我知道在这种情况下,它是首选的方式。 尝试将最后一行修改为返回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
还可以执行内部重定向,实现这一点的一种方法是在
位置
块中使用
重写…最后一个

这种情况下的限制是查找位置块,该位置块将处理受不需要的参数影响的URI集。在下面的示例中,我使用
location/
块,但是您的需求将受到配置中其他
location
块和受影响的URI集的影响

虽然您显然已经成功地分配了内部
$args
变量,但我的回答避免了这种技术

下面的示例使用
rewrite…last
重新实现前面的示例,并添加一个forth
if
块来执行实际的
返回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
块中使用允许的语句,如中所示。

可能重复的“我没有注意到您一直在编辑您的问题”(由于某种原因,通知丢失)。我会再看看这个问题。我没有编辑问题本身。我只是为你的答案编辑了评论。不幸的是,这些评论无法正确格式化,[enter]发布评论,您只有5分钟的时间进行编辑。所以这不是很有条理:)好吧,那样的话,我没有正确地阅读你的问题。希望我的新答案能更好地解决你们的问题。谢谢你们非常详细的回答。明天我将进行彻底的测试,让您知道它是如何工作的。Richard-从服务器性能的角度来看,我认为首选第一种技术,而从SEO和“清洁度”的角度来看,首选第二种技术(外部重定向链)。我的假设正确吗?
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;
}