如何在 nginx 中配置重定向到 url 而没有尾部斜杠?

How to configure redirects to url without trailing slash in nginx?

我想将带有斜线的 URL 重定向到没有尾部斜线的路径。因此 /some-url/ 到 /some-url 重复内容问题

以及其余的网址,例如

/some-url.xml
/some-url?
/some-url/?
/some-url?q=v
/some-url/?q=v
/some-url

应该保留而不重定向。 我想要与以下问题完全相反。

请考虑在您的服务器块内尝试:

rewrite ^/(.*)/$ / permanent;

来自:https://www.scalescale.com/tips/nginx/nginx-remove-trailing-slash/

这将查找请求 URI 以“/”开头并以斜杠结尾(重写后搜索部分末尾的“$”)的任何内容,并将其替换为“/”开头和末尾没有结束斜杠的 URI。最后一部分表明它将提供 301 重定向。

更新: 为避免使用 GET 参数从 URI 中删除斜杠,请尝试:

if ($query_string != "") {
    rewrite ^/(.*)/$ / permanent;
}

通常不建议使用 if 语句,但如果您要使用这样的映射:

map $query_string $trailing_slash {
    ""  ""
    default "/";
}
rewrite ^/(.*)/$ /$trailing_slash permanent;

它会导致对带有查询的任何字符串进行无限重定向,因为它会重定向到自身(源和目标都将包含尾部斜杠)。因此,我们需要使用条件进行重写。

在验证了所有 nginx 配置后,我没有找到任何其他条件和 AND (&&) 条件。最后我在 nginx

中使用了 "set" 属性
  set $val 0;
  if ($request_method ~ "^GET$"){
      set $val 1;
   }

  if ($request_uri ~ ^/(.*)/$ ) {
   set $val "${val}1";
  }

  location / {
          if ($val ~ 11) { rewrite ^/(.*)/$ https://$host/; }
          try_files $uri $uri/ /index.php$is_args$args;
  }