如何在nginx中使用尾部斜杠配置重定向到url?

时间:2017-10-10 11:53:27

标签: url nginx nginx-location canonical-link

我想将没有斜杠的URL重定向到带斜杠的路径。 所以 / some-url / some-url /

其他网址,例如

  • /some-url.xml
  • /一些-URL?
  • /一些-URL] Q = V
  • /一些-URL /

应该没有重定向。

我发现这篇文章https://www.ateamsystems.com/tech-blog/nginx-add-trailing-slash-with-301-redirect-without-if-statements/,其中作者建议使用以下规则:

location ~ ^([^.\?]*[^/])$ {
   try_files $uri @addslash;
}

location @addslash {
    return 301 $uri/;
}

不幸的是,这不起作用。因为网址 / some-url?q = v 被重定向到 / some-url /

您能否建议如何更改正则表达式以使其正常工作?

3 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

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

    try_files $uri $uri/ /index.php$is_args$args;
}

答案 1 :(得分:1)

查询字符串从?开始,并且不是匹配locationrewrite指令时使用的规范化URI的一部分。整个URI可用作$request_uri变量。您可以在if块中使用正则表达式:

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

有关详情,请参阅this documentif使用this caution

答案 2 :(得分:0)

我想出了如何在没有if声明的情况下做到这一点!这解决了您提到的所有问题(情况#2除外,如果情况#3重定向但保留查询字符串)。

# 301 try_file for trailing slash
location ~ ^([^.\?]*[^/])$ {
  try_files $uri @addslash;
}

# 301 redirect for trailing slash
location @addslash {
  return 301 $uri/$is_args$args;
}

# Root directory location handler
location / {
    try_files $uri/index.html $uri $uri/ /index.php?$query_string;
}