反向代理 - 删除子目录

反向代理 - 删除子目录

在不久的将来,我将拥有 3 个 nginx 服务器。其中一个是另外两个 SSL 的反向代理。例如,我转到:

https://www.mysitename.com/site1

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

我有这个...

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://;
    }
}

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

有没有办法让它从 localhost 调用中去掉“site1”?它似乎正在使用 localhost:8081/site1。site1 和 site2 站点的性质为“/login/index”或“/whatever/list”等,没有“site1”。

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

我是否必须重新设计网站的 URL 才能使用 site1?或者 NGINX 代理可以解决这个问题吗?

谢谢。

答案1

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

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

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

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

location /site1/ {
    proxy_pass http://localhost:8081/;
    ...
}

/注意指令中的尾随proxy_pass- 它将替换位置匹配的原始 URI 的一部分,即 /site1/

相关内容