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

本文探讨了在nginx配置中遇到的反向代理问题,当proxy_pass设置为域名时请求无法正常通过。分析了proxy_set_header中Host的三种可能值,并解释了为何将Host设置为目标站点域名对正确处理请求的重要性。删除特定配置后,请求得以成功,揭示了nginx反向代理配置的微妙之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值