我正在尝试使用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提供。
寻找解决方案,或者之前是否有人遇到过同样的问题。
答案 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上托管了两个站点(上游/下游)。因此,如果主机头指向当前域名而不是上游域名,则我的测试将不起作用。
如果您的上游托管在其他服务器上,则上述更改可能与您的测试无关。