NginX SSL Offload $ scheme无效

时间:2013-03-12 14:12:29

标签: tomcat nginx

我正在尝试使用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 个答案:

答案 0 :(得分: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"
    />

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

答案 1 :(得分:1)

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

proxy_pass http://127.0.0.1;

它再次重定向到nginx但是在端口80上。我对它进行了评论,现在一切正常。

感谢大家的帮助。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

在我的devbox中尝试了一些微小的更改。我的上游脚本在从https访问时看到'https',当它来自http时看到'http'。所以你的配置有效。

我改变的唯一一行是发送到上游的主机头。来自

proxy_set_header Host $host;

proxy_set_header Host my_upstream_domain_name;

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

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