如何将带有尾部斜杠的 URL 重定向到非斜杠变体(有例外)?

How to redirect URLs with a trailing slash to the non-slash variant (with exceptions)?

我在设置 NGINX 时遇到了一些问题,以便所有带有尾部斜杠 (/) 的 URL 永久重定向到没有斜杠的变体。问题是除了那些以 /backend.

开头的 URL 之外,这个指令应该发生在所有 URL 上。

例如:

https://example.com/service/ --> https://example.com/service
https://example.com/service/one/ --> https://example.com/service/one
https://example.com/backend/ --> https://example.com/backend/ (should not redirect)

我目前正在使用这个指令:

server {
    listen 80;
    listen 443 ssl http2;

    [...]

    location ~ ^/(?!backend)(.+)/$ {
        return 301 $is_args$args;
    }

    [...]
}

不幸的是,这里出现了以下错误:

https://example.com/service/ --> https://example.com/service/service

谁能帮我解开这个正则表达式之谜?

您的 return 301 $is_args$args; 表达式缺少前导 /,因此浏览器会将重定向解释为相对于当前 URI。 service 相对于 /service//service/service.

要么捕获 </code> 中的前导 <code>/,要么将其显式添加到 return 语句中。

例如:

location ~ ^/(?!backend)(.+)/$ {
    return 301 /$is_args$args;
}