我有以下内容:
- https访问NAS或类似的东西。
- nginx作为储备代理作为容器
- 带有tomcat作为appContainer的容器。
nas将https请求作为http转发到nginx容器。然后Nginx容器将HTTP请求转发到我的AppContainer。
我可以访问我的appContainer登录页面,但是在登录后发表帖子如下nginx Access.log
POST /foo/login.do HTTP/1.1" 302 0 "https://nas.dns.server/foo/login.do
in localhost_access.log in AppContainer tomcat显示
POST /foo/doLogin.do HTTP/1.0" 302
并请求http到NAS
似乎忽略了X-Forwarded Proto标题。
我的nginx.conf配置如下:
server {
listen 80;
server_name $hostname;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
error_log /dev/stdout info;
access_log /dev/stdout;
client_max_body_size 100M;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
resolver 127.0.0.11 valid=30s;
sendfile on;
location /foo {
proxy_set_header Origin "";
set $appcontainer http://appcontainer:8080;
proxy_pass $appcontainer;
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_set_header X-Forwarded-Proto $https; #I’ve also tested with $scheme
}
}
谢谢
在"网络"选项卡中查看Chrome的开发人员工具可以看到login.do
的调用有Request URL: https://entry.proxy.url/foo/doLogin.do
,但是Response Headers
中我可以看到是什么生成问题Location: http://proxy.entry.url/foo/login.do
必须是Location: https://proxy.entry.url/foo/login.do
。
我尝试在该位置进行重定向为proxy_redirect http://entry.proxy.url/ https://csprocure.ciport.be/;
,并且有效。
因此,将位置设置为:
location /foo {
proxy_set_header Origin "";
set $appcontainer http://appcontainer:8080;
proxy_redirect http://proxy.entry.url/ https://proxy.entry.url/;
proxy_pass $appcontainer;
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_set_header X-Forwarded-Proto $https; #I’ve also tested with $scheme
}