原创

Nginx做反向代理之后,访问项目跳转到localhost

Nginx做反向代理之后,访问项目跳转到localhost

如图,实际我是访问的xx.zhyd.me,但是却直接跳转到了localhost/xx,我的Nginx配置如下:

server { listen 80; server_name xx.zhyd.me;
#缓存配置 location ~ .*\.(jpg|png|js|css|ico)(.*){ expires 7d; proxy_pass http://localhost:8085; }
location / { proxy_pass http://localhost:8085;         proxy_redirect off; # 这两个HTTP头是因为采用了nginx作为代理后,后端可以通过 X-real-ip 或 X-Forwarded-For取得用户IP地址 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; } }

找资料

看到网上有介绍说 

首先,我的nginx是1.13.4版本,默认支持server_name_in_redirect off;其次,我的配置中已经配置了server_name,所以不是这个问题。

 ...... 

再次检查配置发现,我是代理到http://localhost:8085;但是在浏览器端访问时,却跳转到localhost,唯独少了一个端口,同时我在浏览器端通过http://localhost:8085是可以正常访问网站的,所以,问题就出在端口转发上。 

解决办法:

#添加如下配置
proxy_set_header Host $host:$server_port;

nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求头中的含义完全相同,除了Host外还有X-Forward-For。 

Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真实的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】。 

 同理,X_Forward_For字段表示该条http请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。因此,在配置用作反向代理的nginx中一般会增加两条配置,修改http的请求头: 

proxy_set_header Host $http_host; 
proxy_set_header X-Forward-For $remote_addr;

这里的$http_host和$remote_addr都是nginx的导出变量,可以再配置文件中直接使用。如果Host请求头部没有出现在请求头中,则$http_host值为空,但是$host值为主域名。因此,一般而言,会用$host代替$http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。

正文到此结束