nginx反向代理地址是域名时请求不通的情况

查了一天才查出来原因。就是因为很简单的问题。虽然现在还是不懂

 

使用nginx的反向代理,是解决跨域的一个重要方法。在nginx的配置文件中,我们通常可以看到这么一段:

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可以看出,这些语句是设置请求头的。
在我们的项目代理中,配置的代理地址都直接是服务器ip地址,如:

location ^~ /proxy/v1/ {
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_pass http://192.168.5.85:8080/v1/;
}

最近在写一个mock服务,想要通过mock服务来改变请求结果等,但是将proxy_pass改为mock服务的域名后,却发现请求失败了。
域名my.test.com的相关代理设置如下:

location ^~ /proxy/v1/ {
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_pass http://test.mock.com/v1/;
}

请求接口为http://test.mock.com/v1/user/info
test.mock.com通过host绑定另一台电脑上。
因为在浏览器中直接访问http://test.mock.com/v1/user/info可以直接得到返回结果,所有判断代理地址设置是没有错的。保证试一试的态度,将代理中proxy_set_header三行设置删除后,发现请求http://my.test.com/proxy/v1/user/info成功。

nginx中proxy_set_header:
语法:proxy_set_header field value
默认值:

proxy_set_header Host $proxy_host
proxy_set_header Connection close

Host的值有三种:$proxy_host、$host、$http_host。
http_host是http请求中的host host是http请求中的host,如果请求中没传,那就是虚拟主机的主域名 $proxy_host是被代理的主机的域名,而非本nginx的。如果发送请求时,请求头中携带了host,则以请求头中的host为主。

当proxy_set_header 设置为$host时,通过http://my.test.com/proxy/v1/user/info请求时,host是my.test.com,而当删除了代理中设置的Host时,默认为$proxy_host即test.mock.com。

要代理到其他网站, HTTP Header 里的 Host 就要设置成目标站点的域名,这样请求发到目标站点,目标站点的 Web 服务器才能正确处理请求。
参考:What is the difference between Nginx variables $host, $http_host, and $server_name?
————————————————
版权声明:本文为CSDN博主「这个昵称没有被占用吧」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/csm0912/article/details/86509899

posted @ 2022-09-07 22:40  愛羅  阅读(925)  评论(0编辑  收藏  举报