我正在尝试在 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 设置的值。