nginx配置proxy_pass后返回404問題以及Nginx host相關(guān)變量的說明
預(yù)備知識(shí)
這里我們先了解Nginx中host相關(guān)的變量($host/$http_host/$proxy_host) ,有助于我們理解和解決 proxy_pass 404問題。
$hostrequest 請(qǐng)求過來的host,不管是域名還是IP,不管是否為80/443端口,值都為域名或者IP,不帶端口$http_hostrequest 請(qǐng)求過來的host,不管是域名還是IP,如果是非80/443端口,值都為域名或者IP加帶端口,如果是非80/443端口,值都為域名或者IP$proxy_host內(nèi)部進(jìn)行proxy配置轉(zhuǎn)發(fā)的時(shí)候默認(rèn)配置的Host為 $proxy_host, 值為配置的 proxy_pass的值的 域名或者IP部分
比如:
location /demo/ {
proxy_pass http://ops.colinspace.com/;
}
則 proxy_host為 ops.colinspace.com;
如果配置如下:
location /demo/ {
proxy_pass http://192.168.3.108:8090/;
}
則 proxy_host為 192.168.3.108:8090;
然后我們?cè)僬f proxy_pass抓發(fā)的時(shí)候默認(rèn)的Host為 $proxy_host
在nginx官網(wǎng)有個(gè)解釋:
By default, NGINX redefines two header fields in proxied requests, “Host” and “Connection”, and eliminates the header fields whose values are empty strings.
“Host” is set to the $proxy_host variable, and “Connection” is set to close.
來源參考: https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
問題分析和修正
其實(shí)通過上面的預(yù)備知識(shí),現(xiàn)在我們很容易猜到問題所在。
對(duì),問題的點(diǎn)就在于 proxy_pass 轉(zhuǎn)發(fā)的時(shí)候 Host 變量的值不對(duì)。
對(duì)問題進(jìn)行問題
1、我們可以在access_log 的輸出中打印分別打印出來這三個(gè)變量的值,然后進(jìn)行請(qǐng)求觀察分析日志,
2、對(duì)比分析不同的域名下關(guān)于 proxy相關(guān)的配置,發(fā)現(xiàn)出問題的域名相比沒有問題的域名引用了一個(gè) proxy.conf 的公共配置,這個(gè)里面默認(rèn)設(shè)置了
proxy_set_header Host $host
但是proxy轉(zhuǎn)發(fā)的時(shí)候這個(gè)值應(yīng)該為 $proxy_host 才對(duì), 所以要么取消 對(duì) proxy.conf 公共引用(不建議,因?yàn)闅v史添加肯定有原因);
要么采用如下方案在對(duì)應(yīng)的location中進(jìn)行添加
location /demo/ {
proxy_set_host Host $proxy_host;
# 或者也可以直接指定為轉(zhuǎn)發(fā)的域名
# proxy_set_host Host 'ops.colinspace.com';
proxy_pass http://ops.colinspace.com/;
}
然后reload,再次請(qǐng)求驗(yàn)證,404 問題修正
問題擴(kuò)展
- 為什么請(qǐng)求的時(shí)候Header中需要帶一個(gè)Host配置項(xiàng)呢?
- 你有沒有注意到瀏覽器請(qǐng)求的時(shí)候,Header中默認(rèn)會(huì)自動(dòng)幫忙我們添加這樣的Host配置項(xiàng)呢,或者有時(shí)候我們使用curl進(jìn)行接口驗(yàn)證的時(shí)候也需要指定Host才可以
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nginx報(bào)錯(cuò)"Too many open files"問題的深度解析
在高并發(fā)場景下,Nginx作為Web服務(wù)器或反向代理時(shí),常常會(huì)遇到“Too many open files”錯(cuò)誤,本文將從問題原理,解決方案,配置優(yōu)化及驗(yàn)證方法等方面,詳細(xì)解析如何解決這一問題,希望對(duì)大家有所幫助2025-06-06
502?Bad?Gateway產(chǎn)生的原因及8個(gè)詳細(xì)的解決方法總結(jié)
Nginx?502?Bad?Gateway的錯(cuò)誤已經(jīng)遇到好幾次了,這里做一下記錄,備忘,下面這篇文章主要給大家介紹了關(guān)于502?Bad?Gateway產(chǎn)生的原因及8個(gè)詳細(xì)的解決方法,文中的介紹非常詳細(xì),需要的朋友可以參考下2023-05-05
linux(centos5.5)/windows下nginx開啟phpinfo模式功能的配置方法分享
某站點(diǎn)用到結(jié)合phpinfo功能的urlrewrite,在nginx中需要在nginx.conf文件中進(jìn)行配置才可支持phpinfo2013-02-02
修改nginx站點(diǎn)根目錄總結(jié)經(jīng)驗(yàn)(小結(jié))
這篇文章主要介紹了修改nginx站點(diǎn)根目錄總結(jié)經(jīng)驗(yàn)(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06
使用nginx正向代理實(shí)現(xiàn)訪問外網(wǎng)
這篇文章主要介紹了使用nginx正向代理實(shí)現(xiàn)讓內(nèi)網(wǎng)主機(jī)通過外網(wǎng)主機(jī)訪問外網(wǎng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
nginx+tomcat實(shí)現(xiàn)多級(jí)反向代理的示例代碼
本文介紹在CentOS系統(tǒng)下安裝Tomcat、配置虛擬主機(jī)多級(jí)目錄,并通過Nginx反向代理將請(qǐng)求轉(zhuǎn)發(fā)至指定IP,構(gòu)建多級(jí)代理拓?fù)鋵?shí)現(xiàn)負(fù)載均衡與訪問控制,感興趣的可以了解一下2025-07-07

