反向代理 - 删除子目录

Chr*_*mag 29 nginx

在不久的将来,我将拥有 3 个 nginx 服务器。一个是其他两个的 SSL 反向代理。所以,例如,我去:

https://www.mysitename.com/site1
Run Code Online (Sandbox Code Playgroud)

本示例中的另外两个服务器是 site1 和 site2。我在代理上安装了 SSL 证书,我想使用反向代理(不需要 SSL,因为所有 3 个都在内部网络上)。出于测试目的,我让 nginx 在 443 上监听 SSL/反向代理,请监听端口 8081 是用于站点 1 的 Rails 应用程序,而 8082 用于站点 2。

我有这个...

server {
    listen                  443;
    server_name             mysitename.com;

    ssl                     on;
    ssl_certificate         ssl/mysitename.com.crt;
    ssl_certificate_key     ssl/mysitename.com.key;
    keepalive_timeout       60;

    location /site1 {
        proxy_pass http://localhost:8081;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }

    location /site2 {
        proxy_pass http://localhost:8082;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我访问 www.mysitename.com/site1 时,我希望它基本上返回通常来自 localhost:8081 的内容(或稍后返回另一台服务器的内部 IP)。

有没有办法让它从本地主机调用中删除“site1”?它似乎在做的是使用 localhost:8081/site1。site1 和 site2 站点具有“/login/index”或“/whatever/list”等性质,没有“site1”。

站点控制器中也有重定向(使用redirect_to),从/login/index 到/whatever/list。

我是否必须重新设计站点的 URL 才能使用 site1?或者 NGINX 代理能弄明白吗?

谢谢。

Max*_*nin 57

引用http://nginx.org/r/proxy_pass

如果使用 URI 指定了 proxy_pass,则在向服务器传递请求时,与位置匹配的规范化请求 URI 的一部分将被指令中指定的 URI 替换:

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,你必须proxy_pass像这样使用:

location /site1/ {
    proxy_pass http://localhost:8081/;
    ...
}
Run Code Online (Sandbox Code Playgroud)

注意尾随/proxy_pass指令-它会替代的位置,也就是匹配原始的URI的一部分 /site1/

  • 只需要一个斜杠就可以解决问题!?感谢那。现在弄清楚我将如何处理 redirect_to - 但这不是服务器问题,所以我会在其他地方弄清楚。 (2认同)