Nginx删除尾随的问号

时间:2019-01-06 02:20:45

标签: nginx url-rewriting

我正在尝试在Nginx中制定重写规则,以从网址中删除试用问号(?),但我无法正确执行。我这样做是为了使斜杠像这样:

#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 个答案:

答案 0 :(得分:0)

?标记查询字符串的开头,并且不属于rewritelocation指令使用的规范化URI的一部分。因此,您无法使用rewrite语句将其删除。

您需要查看$request_uri变量中的原始请求。

例如:

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

有关if的使用,请参见this caution