我有一个位置
location /pass/ {
proxy_pass http://localhost:12345/;
}
因此它应该将 URL 代理http://example.com/pass/whatever
到http://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_pass 或 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 就可以更快地找到匹配项。