nginx配置中$http_host、$host、$host:$proxy_port和$host:$server_port區(qū)別解析
nginx配置中$http_host、$host、$host:$proxy_port和$host:$server_port區(qū)別
1.proxy_set_header設置的請求頭是傳遞給后端服務器的
ngixn反向代理中proxy_set_header的設置:
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 X-Forwarded-Uri $request_uri;
解析:
1)$http_host:代理服務器本機IP。
2)$remote_addr:前一節(jié)點的IP,并不一定是用戶的真實IP。
$proxy_host:代理服務器請求的host,即后端服務器/源站的IP,后端服務器有可能還是代理服務器。
$proxy_port:代理服務器請求的后端服務器的端口。
3)$http_x_real_ip:獲取的是前一節(jié)點的X-Real-IP的值。
4)$proxy_add_x_forwarded_for:獲取的是前一節(jié)點的X-Forwarded-For的值。
3. X-Forwarded-For 對應不同值:
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
當只有一層代理服務器的情況下,兩者的X-Forwarded-For值?致,都是應用的真實IP。
區(qū)別
$remote_addr是前一節(jié)點的IP,并不一定是用戶的真實IP。
$proxy_add_x_forwarded_for變量包含$http_x_forwarded_for與$remote_addr兩部分,他們之間用逗號分開。
$proxy_port和$server_port區(qū)別:
$host:$proxy_port:Nginx監(jiān)聽的端口
$host:$server_port:服務真正訪問的端口
補充:
nginx中proxy_set_header Host $host的作用及$proxy_host,$host與$http_host的區(qū)別
一、nginx中proxy_set_header Host $host的作用
nginx為了實現(xiàn)反向代理的需求而增加了一個ngx_http_proxy_module模塊。其中proxy_set_header指令就是該模塊需要讀取的配置文件。在這里,所有設置的值的含義和http請求體中的含義完全相同,除了Host外還有X-Forward-For。
Host的含義是表明請求的主機名,因為nginx作為反向代理使用,而如果后端真實服務器設置有類似防盜鏈或者根據(jù)http請求頭中的host字段來進行路由或判斷功能的話,如果反向代理層的nginx不重寫請求頭中的host字段,將會導致請求失敗【默認反向代理服務器會向后端真實服務器發(fā)送請求,并且請求頭中的host字段應為proxy_pass指令設置的服務器】
同理,X_Forward_For字段表示該條http請求是由誰發(fā)起的?如果反向代理服務器不重寫該請求頭的話,那么后端真實服務器在處理時會認為所有的請求都來在反向代理服務器,如果后端有防攻擊策略的話,那么機器就被封掉了。因此,在配置用作反向代理的nginx中一般會增加兩條配置,修改http的請求頭。
proxy_set_header Host $http_host; proxy_set_header X-Forward-For $remote_addr;
這里的$http_host和$remote_addr都是nginx的導出變量,可以在配置文件中直接使用。如果Host請求頭部沒有出現(xiàn)在請求頭中,則$http_host值為空,但是$host值為主域名。因此,一般而言,會用$host代替$http_host變量,從而避免http請求中丟失Host頭部的情況下Host不被重寫的失誤。
X-Forwarded-For:簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理或者負載均衡服務器時才會添加該項。 它不是RFC中定義的標準請求頭信息,在squid緩存代理服務器開發(fā)文檔中可以找到該項的詳細介紹。標準格式如下:X-Forwarded-For: client1, proxy1, proxy2。
這一HTTP頭一般格式如下:X-Forwarded-For: client1, proxy1, proxy2。其中的值通過一個“逗號+空格”把多個IP地址區(qū)分開, 最左邊(client1)是最原始客戶端的IP地址, 代理服務器每成功收到一個請求,就把請求來源IP地址添加到右邊。
在上面這個例子中,這個請求成功通過了三臺代理服務器:proxy1, proxy2 及 proxy3。請求由client1發(fā)出,到達了proxy3(proxy3可能是請求的終點)。請求剛從client1中發(fā)出時,XFF是空的,請求被發(fā)往proxy1;通過proxy1的時候,client1被添加到XFF中,之后請求被發(fā)往proxy2;通過proxy2的時候,proxy1被添加到XFF中,之后請求被發(fā)往proxy3;通過proxy3時,proxy2被添加到XFF中,之后請求的的去向不明,如果proxy3不是請求終點,請求會被繼續(xù)轉(zhuǎn)發(fā)。
鑒于偽造這一字段非常容易,應該謹慎使用X-Forwarded-For字段。正常情況下XFF中最后一個IP地址是最后一個代理服務器的IP地址, 這通常是一個比較可靠的信息來源。
二、proxy_set_header設置Host為$proxy_host,$host與$local_host的區(qū)別
先來看下proxy_set_header的語法:proxy_set_header
field
value
;
默認值:
proxy_set_header Host $proxy_host; proxy_set_header Connection close;
上下文:http
, server
, location
作用:允許重新定義或者添加發(fā)往后端服務器的請求頭。value
可以包含文本、變量或者它們的組合。 當且僅當當前配置級別中沒有定義proxy_set_header
指令時,會從上面的級別繼承配置。 默認情況下,只有兩個請求頭會被重新定義:
proxy_set_header Host $proxy_host; proxy_set_header Connection close;
nginx對于upstream默認使用的是基于IP的轉(zhuǎn)發(fā),因此對于以下配置:
upstream backend { server 127.0.0.1:8080; } upstream crmtest { server crmtest.aty.sohuno.com; } server { listen 80; server_name chuan.aty.sohuno.com; proxy_set_header Host $http_host; proxy_set_header x-forwarded-for $remote_addr; proxy_buffer_size 64k; proxy_buffers 32 64k; charset utf-8; access_log logs/host.access.log main; location = /50x.html { root html; } location / { proxy_pass backend ; } location = /customer/straightcustomer/download { proxy_pass http://crmtest; proxy_set_header Host $proxy_host; } }
當匹配到 /customer/straightcustomer/download時,使用crmtest處理,到upstream就匹配到crmtest.aty.sohuno.com,這里直接轉(zhuǎn)換成IP進行轉(zhuǎn)發(fā)了。假如crmtest.aty.sohuno.com是在另一臺nginx下配置的,ip為10.22.10.116,則$proxy_host則對應為10.22.10.116。此時相當于設置了Host為10.22.10.116。
// 如果想讓Host是crmtest.aty.sohuno.com,則進行如下設置: proxy_set_header Host crmtest.aty.sohuno.com; // 如果不想改變請求頭“Host”的值,可以這樣來設置: proxy_set_header Host $http_host; // 但是,如果客戶端請求頭中沒有攜帶這個頭部,那么傳遞到后端服務器的請求也不含這個頭部。 // 這種情況下,更好的方式是使用$host變量——它的值在請求包含“Host”請求頭時為“Host”字段的值,在請求未攜帶“Host”請求頭時為虛擬主機的主域名: proxy_set_header Host $host; // 此外,服務器名可以和后端服務器的端口一起傳送: proxy_set_header Host $host:$proxy_port; // 如果某個請求頭的值為空,那么這個請求頭將不會傳送給后端服務器: proxy_set_header Accept-Encoding "";
到此這篇關于nginx配置中$http_host、$host、$host:$proxy_port和$host:$server_port區(qū)別的文章就介紹到這了,更多相關nginx配置$http_host、$host、$host:$proxy_port和$host:$server_port內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nginx+Windows搭建域名訪問環(huán)境的操作方法
這篇文章主要介紹了Nginx搭建域名訪問環(huán)境,包括nginx配置文件的相關介紹及對nginx配置文件的分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03權限問題導致Nginx 403 Forbidden錯誤的解決方法
這篇文章主要介紹了權限問題導致Nginx 403 Forbidden錯誤的解決方法,本文中導致 403 Forbidden錯誤的原因是配置文件中沒有指明一個用戶,需要的朋友可以參考下2014-08-08