首页 > 解决方案 > Nginx 删除尾随问号

问题描述

我正在尝试在 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;

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

这是我想做的事情:

所以基本上只有在没有查询字符串的情况下才删除问号。我怎样才能做到这一点?

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

标签: nginxurl-rewriting

解决方案


标记查询字符串的?开始,并且不是rewriteorlocation指令使用的规范化 URI 的一部分。因此,您不能使用rewrite语句将其删除。

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

例如:

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

请参阅此使用注意事项if


推荐阅读