0

我正在尝试使用 Nginx 和 Tomcat 进行 ssh 卸载。我的设置是:浏览器 -(HTTPS)-> nginx -> (http/https) -> tomcat

我已经设置 nginx 在 x-forwarded-proto 标头中转发请求方案。

                    proxy_pass http://default_upstream;
                    add_header Set-Cookie "SRVGROUP=$group; path=/";
                    proxy_next_upstream error;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Host $http_host;
                    proxy_set_header X-Forwarded-For $http_x_forwarded_for;
                    proxy_set_header X-URI $uri;
                    proxy_set_header X-ARGS $args;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header X-Scheme $scheme;
                    proxy_set_header Refer $http_refer;
                    proxy_redirect http:// $scheme://;
                    proxy_set_header Strict-Transport-Security "max-age=7200";

在 tomcat 上,我打印 X-Forwarded-Proto 标头,我总是得到 http。如果我更换

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Forwarded-Proto https;

一切正常。但我想使用 $scheme,因为并非我的所有页面都通过 https 提供。

寻找解决方案,或者是否有人以前遇到过同样的问题。

4

4 回答 4

2

请试试:

方法1:

proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

方法2:

nginx.conf
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

server.xml:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="x-forwarded-for"
       remoteIpProxiesHeader="x-forwarded-by"
       protocolHeader="X-Forwarded-Proto"
       httpsServerPort="443"
    />

如果还是有问题,建议你tcpdump nginx和tomcat之间的数据

于 2014-08-20T03:37:10.153 回答
1

我找到了。在我的 ssl nginx 配置中,有人留下了这个:

proxy_pass http://127.0.0.1;

它几乎再次重定向到 nginx,但在端口 80 上。我将其注释掉,现在一切正常。

感谢大家的帮助。

于 2013-03-14T14:49:53.550 回答
0

proxy_set_header X-Forwarded-Proto https;对于 SSL 卸载是正确的。您似乎期待的是 Nginx 代理 http 连接。这也是可行的,但是您需要将其单独设置为端口 80 的侦听器,然后代理与上游服务器的连接。

基本上,您需要为端口 443 和端口 80 提供单独的服务器配置块。

于 2013-03-12T19:09:39.893 回答
0

在我的 devbox 中尝试了您的配置,并进行了一些小的更改。我的上游脚本在从 https 访问时看到“https”,在从 http 访问时看到“http”。所以你的配置有效。

我更改的唯一行是发送到上游的 Host 标头。从

proxy_set_header Host $host;

proxy_set_header Host my_upstream_domain_name;

我将两个站点(上游/下游)托管在同一个 devbox 上。因此,如果主机头指向当前域名,而不是上游的域名,我的测试将不起作用。

如果您的上游托管在不同的服务器上,上述更改可能与您的测试无关。

于 2013-03-13T03:04:20.980 回答