如何在 nginx 中配置重定向到带有尾部斜杠的 url



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

其余的网址,如

  • /some-url.xml
  • /some-url?
  • /some-url?q=v
  • /
  • some-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/;
}

不幸的是,这并不真正有效。因为 url /some-url?q=v 被重定向到/some-url/

你能建议如何更改正则表达式以使其工作吗?

这应该可以解决问题:

location / {
    if ($request_uri ~ ^([^.?]*[^/])$) {
        return 301 $1/;
    }
    try_files $uri $uri/ /index.php$is_args$args;
}

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

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

请参阅此文档了解更多信息,以及有关使用if的注意事项。

我想出了如何在没有 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;
}

最新更新