![将任何 URL 代理到静态、未改变的 URL?](https://linux22.com/image/687295/%E5%B0%86%E4%BB%BB%E4%BD%95%20URL%20%E4%BB%A3%E7%90%86%E5%88%B0%E9%9D%99%E6%80%81%E3%80%81%E6%9C%AA%E6%94%B9%E5%8F%98%E7%9A%84%20URL%EF%BC%9F.png)
server {
listen 8000;
location / {
proxy_pass http://other.com/section;
}
}
现在:
- 正如预期的那样,
http://127.0.0.1:8000
重定向到http://other.com/section
, - 但是,
http://127.0.0.1:8000/something
重定向到http://proxy.com/section/something
。
我怎样才能http://127.0.0.1:8000/(.*)
代理到http://proxy.com/section
而不是http://proxy.com/section/(.*)
?
答案1
来自 nginxproxy_pass
文档:
如果 proxy_pass 指令指定了 URI,那么当请求传递到服务器时,规范化请求 URI 中与位置匹配的部分将被指令中指定的 URI 替换:
如果指定了 proxy_pass 但没有指定 URI,则在处理原始请求时,请求 URI 将以客户端发送的相同形式传递给服务器,或者在处理更改的 URI 时传递完整的规范化请求 URI:
因此,您的配置存在问题,因为您缺少行/
末的proxy_pass
。您应该使用以下命令:
proxy_pass http://other.com/section/;
答案2
我找到了一个解决方法:
server {
listen 8000;
location / {
proxy_pass http://other.com/section?; <-- added a question mark
}
}
http://127.0.0.1:8000
重定向至http://other.com/section?
,http://127.0.0.1:8000/something
重定向到http://proxy.com/section?something
。
对我来说,这很有效,因为查询字符串将被忽略,但我仍在寻找适当的方法来做到这一点。
答案3
那正是代理密码做。从手册页nginx:
如果使用 URI 指定了 proxy_pass 指令,则当请求传递到服务器时,与位置匹配的规范化请求 URI 的部分将被 URI 替换
您可以尝试类似的方法:
rewrite ^(.*)$ http://other.com/section permanent;