nginx 不需要的位置重定向,带有尾部斜杠

nginx 不需要的位置重定向,带有尾部斜杠

我有一个位置

location /pass/ {
    proxy_pass http://localhost:12345/;
}

因此它应该将 URL 代理http://example.com/pass/whateverhttp://localhost:12345/whatever

我不喜欢的是 nginx 会自动添加斜线到

http://example.com/pass

http://example.com/pass/通过 301 重定向

我怎样才能简单地避免这种行为。我想/pass不带尾部斜线转到另一个位置。提前致谢!

答案1

有一种特殊情况,以proxy_pass结尾location/会导致自动隐式301重定向而不转到后端;您必须创建一个location没有尾随斜杠的显式重定向以避免这种情况:

如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pa​​ss 或 grpc_pass 之一处理,则将执行特殊处理。响应 URI 等于此字符串但没有尾部斜杠的请求,将返回带有代码 301 的永久重定向到附加了斜杠的请求 URI。如果不希望这样,可以像这样定义 URI 和位置的精确匹配:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}

例如,您必须/pass location在现有的基础上再创建一个显式的/pass/,否则,location /pass {return 301 /pass/…;}将为您创建一个隐式的。

但是,您确定要这样做吗?如果您要省略从/pass到 的重定向/pass/,那么相对路径将不起作用。一些较新的浏览器还倾向于具有有缺陷的 UI/UX,可能不会向用户显示尾部斜杠,这可能会在尝试排除区别时使事情变得更加混乱。

答案2

就像你想的那样另一个地点,一个自然的解决方案是添加该位置

location /pass {
}

默认情况下,nginx 将在 Web 根目录中查找名为“pass”的文件。如果您不喜欢此默认设置,您可以在此新位置块中添加更多指令来实现此目的。

您也可以使用

location = /pass {
}

这样 nginx 就可以更快地找到匹配项。

相关内容