前因后果就不说了,就是用到了重定向,然而在项目是使用Nginx的反向代理,然后问题就来了,在访问项目地址的时候,页面报出503 service Unavailable,检查了一下路径,发现路径中端口号没有了,例如122.51.157.193:9099直接就变成了122.51.157.193,百思不得其解!
因为种种原因,Nginx并不能监听在80端口,或者外部通过NAT方式将请求丢给Nginx,外部地址并不是标准http(s)端口,此时Nginx并不能美好的处理这些重定向。发生重定向的时候会丢失端口。
#反向代理
listen 81 default_server;
set $TOMCAT_HOME /var/lib/tomcat7;
location / {
root $TOMCAT_HOME/webapps/ROOT;
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 访问/data的时候会自动加上/成为/data/
listen 81 default_server;
location /data {
root /var/data;
}
处理
这个很容易搞定,网上流传开来的proxy_set_header对此不起作用。后来我发现gitlab-ce这个用非标准端口访问是没有问题的,我看了一下gitlab-ce的nginx配置,发现是这么配置的:
proxy_set_header Host $http_host;
我又发现nginx软件包释放出的配置文件(from ppa: NGINX Stable),发现里面其实是带有一个参考文件/etc/nginx/proxy_params
proxy_set_header Host $http_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 $scheme;
这里面写的也是 proxy_set_header Host $http_host;,于是乎直接include,搞定
location / {
root $TOMCAT_HOME/webapps/ROOT;
proxy_pass http://127.0.0.1:8080/;
include proxy_params;
}
没这个文件就把这些内容手工敲到location配置段下。
再细看官方文档,其实也提及了:
An unchanged “Host” request header field can be passed like this:
proxy_set_header Host $http_host;