proxy_set_header?允許重新定義或者添加發(fā)往后端服務(wù)器的請(qǐng)求頭。value
可以包含文本、變量或者它們的組合。 當(dāng)且僅當(dāng)當(dāng)前配置級(jí)別中沒(méi)有定義proxy_set_header
指令時(shí),會(huì)從上面的級(jí)別繼承配置。 默認(rèn)情況下,只有兩個(gè)請(qǐng)求頭會(huì)被重新定義:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
?
nginx對(duì)于upstream默認(rèn)使用的是基于IP的轉(zhuǎn)發(fā),因此對(duì)于以下配置:
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;??
}??
}
?
當(dāng)匹配到/front時(shí),使用web處理,到upstream就匹配到abc.com,這里直接轉(zhuǎn)換成IP進(jìn)行轉(zhuǎn)發(fā)。假如abc.com是在另一臺(tái)nginx下配置的,ip為10.10.10.10,則$proxy_host則對(duì)應(yīng)為10.10.10.10。此時(shí)相當(dāng)于設(shè)置了Host為10.10.10.10。如果想讓Host是abc.com,則進(jìn)行如下設(shè)置:
proxy_set_header Host abc.com;
?
如果不想改變請(qǐng)求頭“Host”的值,可以這樣來(lái)設(shè)置:
?proxy_set_header Host? $http_host;
?
但是,如果客戶(hù)端請(qǐng)求頭中沒(méi)有攜帶這個(gè)頭部,那么傳遞到后端服務(wù)器的請(qǐng)求也不含這個(gè)頭部。 這種情況下,更好的方式是使用$host變量——它的值在請(qǐng)求包含“Host”請(qǐng)求頭時(shí)為“Host”字段的值,在請(qǐng)求未攜帶“Host”請(qǐng)求頭時(shí)為虛擬主機(jī)的主域名:
?proxy_set_header Host? $host;
?
此外,服務(wù)器名可以和后端服務(wù)器的端口一起傳送:
?proxy_set_header Host? ?$host:$proxy_port;
?
如果某個(gè)請(qǐng)求頭的值為空,那么這個(gè)請(qǐng)求頭將不會(huì)傳送給后端服務(wù)器:
?proxy_set_header Accept-Encoding "";
?