nginx返回301删除一些参数

问题描述 投票:1回答:1

我正在尝试使用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,但它对我没有用。

任何想法我怎么能正确地完成这个?

redirect nginx http-status-code-301
1个回答
1
投票

要以不确定的顺序删除多个不需要的参数,您需要使用某种形式的递归。您的问题包含一个使用外部重定向循环的示例,但遭遇不需要的边缘情况。

留下尾随?&的边缘情况可以使用多个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块中的允许语句。

© www.soinside.com 2019 - 2024. All rights reserved.