nginx 之$proxy_host|$host|$http_host區別
value
可以包含文本、變量或者它們的組合。 當且僅當當前配置級別中沒有定義proxy_set_header
指令時,會從上面的級別繼承配置。 默認情況下,只有兩個請求頭會被重新定義:proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
nginx對於upstream默認使用的是基於IP的轉發,因此對於以下配置:
upstream web {
server abc.com;
}
server {
listen 80;
server_name www.hehe.com;
location /front {
proxy_pass http://web;
proxy_set_header Host $proxy_host;
}
}
當匹配到/front時,使用web處理,到upstream就匹配到abc.com,這裏直接轉換成IP進行轉發。假如abc.com是在另一臺nginx下配置的,ip為10.10.10.10,則$proxy_host則對應為10.10.10.10。此時相當於設置了Host為10.10.10.10。如果想讓Host是abc.com,則進行如下設置:
proxy_set_header Host abc.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 之$proxy_host|$host|$http_host區別