Nginx 从 URL 中删除尾随问号

Nginx 从 URL 中删除尾随问号

我正在尝试在 Nginx 中创建重写规则以从 URL 中删除试探性问号 ( ?),但我做不到。我已经对尾部斜杠执行了此操作,如下所示:

#redirect all trailing slash URL's to the respective non trailing slash
rewrite ^/(.*)/$ /$1 permanent;

因此我认为只需将斜线替换为问号即可达到同样的效果:

rewrite ^/(.*)?$ /$1 permanent;

但这不起作用,但我突然想到问号在正则表达式中具有一定意义,所以我尝试将其转义:

rewrite ^/(.*)\?$ /$1 permanent;

但这也不起作用,我还尝试删除第一个斜线:

rewrite ^(.*)\?$ $1 permanent;

但这也是失败的,是的,我在测试之间确实重新启动了服务器。

以下是我想做的事情:

  • www.mysite.com?应该重定向到wwww.mysite.com
  • www.mysite.com/some/path?应该重定向到wwww.mysite.com/some/path
  • www.mysite.com?some=vars应保持不变。
  • www.mysite.com/some/path?some=vars应保持不变。

因此基本上只有在没有查询字符串的情况下才删除问号。我该如何实现呢?

我检查了其他答案,但他们似乎想完全删除查询字符串,我只想在只有问号而没有参数的情况下删除。

答案1

Richard Smith 给了我答案,我也会把答案留在这里,以防有人最终回答这个问题:

if ($request_uri ~ ^(.*)\?$) { return 301 $1; }

答案2

请尝试以下操作:

if ($is_args) {
    if ($args = "") {
        return 301 $uri;
    }
}

我还没有测试过,所以不确定这是否可行。这完全取决于$is_args当 URL 中只有问号而没有任何参数时 nginx 设置的值。

相关内容