将任何 URL 代理到静态、未改变的 URL?

将任何 URL 代理到静态、未改变的 URL?
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;

相关内容