NGINX中的proxy_pass和rewrite
文章作者:luxianghao
文章來源:http://www.cnblogs.com/luxianghao/p/6807081.html 轉(zhuǎn)載請(qǐng)注明漱抓,謝謝合作卷拘。
免責(zé)聲明:文章內(nèi)容僅代表個(gè)人觀點(diǎn)刚盈,如有不當(dāng),歡迎指正耻瑟。
rewrite
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;">syntax: rewrite regex replacement [flag]
Default: —
Context: server, location, if</pre>
如果正則表達(dá)式(regex)匹配到了請(qǐng)求的URI(request URI),這個(gè)URI會(huì)被后面的replacement替換
rewrite的定向會(huì)根據(jù)他們?cè)谂渲梦募谐霈F(xiàn)的順序依次執(zhí)行
通過使用flag可以終止定向后進(jìn)一步的處理
如果replacement以“http://”, “https://”, or “$scheme”開頭供嚎,處理將會(huì)終止吧雹,請(qǐng)求結(jié)果會(huì)以重定向的形式返回給客戶端(client)
-
如果replacement字符串里有新的request參數(shù),那么之前的參數(shù)會(huì)附加到其后面账嚎,如果要避免這種情況莫瞬,那就在replacement字符串后面加上“?”郭蕉,eg:
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;"> rewrite ^/users/(.*)
1? last;=</pre>
如果正則表達(dá)式(regex)里包含“}” or “;”字符疼邀,需要用單引號(hào)或者雙引號(hào)把正則表達(dá)式引起來
可選的flag參數(shù)如下:
- last
- 結(jié)束當(dāng)前的請(qǐng)求處理,用替換后的URI重新匹配location召锈;
- 可理解為重寫(rewrite)后旁振,發(fā)起了一個(gè)新請(qǐng)求,進(jìn)入server模塊涨岁,匹配location拐袜;
- 如果重新匹配循環(huán)的次數(shù)超過10次,nginx會(huì)返回500錯(cuò)誤梢薪;
- 返回302 http狀態(tài)碼 蹬铺;
- 瀏覽器地址欄顯示重地向后的url
- break
- 結(jié)束當(dāng)前的請(qǐng)求處理,使用當(dāng)前資源秉撇,不在執(zhí)行l(wèi)ocation里余下的語句甜攀;
- 返回302 http狀態(tài)碼 ;
- 瀏覽器地址欄顯示重地向后的url
- redirect
- 臨時(shí)跳轉(zhuǎn)琐馆,返回302 http狀態(tài)碼规阀;
- 瀏覽器地址欄顯示重地向后的url
- permanent
- 永久跳轉(zhuǎn),返回301 http狀態(tài)碼啡捶;
- 瀏覽器地址欄顯示重定向后的url
proxy_pass
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;">Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except</pre>
不影響瀏覽器地址欄的url
設(shè)置被代理server的協(xié)議和地址姥敛,URI可選(可以有,也可以沒有)
協(xié)議可以為http或https
-
地址可以為域名或者IP瞎暑,端口可選彤敛;eg:
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;"> proxy_pass http://localhost:8000/uri/;</pre>
-
如果一個(gè)域名可以解析到多個(gè)地址,那么這些地址會(huì)被輪流使用了赌,此外墨榄,還可以把一個(gè)地址指定為 server group(如:nginx的upstream), eg:
[復(fù)制代碼](javascript:void(0); "復(fù)制代碼")
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;">upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;server backup1.example.com:8080 backup; server backup2.example.com:8080 backup;
}
server {
[
location / {
proxy_pass http://backend;
}
}</pre>復(fù)制代碼](javascript:void(0); "復(fù)制代碼")
-
server name, port勿她, URI支持變量的形式袄秩,eg:
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;">proxy_pass http://
uri;</pre>
這種情況下,nginx會(huì)在server groups(upstream后端server)里搜索server name,如果沒有找到之剧,會(huì)用dns解析
請(qǐng)求的URI按照下面的規(guī)則傳給后端server
-
如果proxy_pass的URL定向里包括URI郭卫,那么請(qǐng)求中匹配到location中URI的部分會(huì)被proxy_pass后面URL中的URI替換,eg:
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;">location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
請(qǐng)求http://127.0.0.1/name/test.html 會(huì)被代理到http://example.com/remote/test.html</pre> -
如果proxy_pass的URL定向里不包括URI背稼,那么請(qǐng)求中的URI會(huì)保持原樣傳送給后端server贰军,eg:
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;">location /name/ {
proxy_pass http://127.0.0.1;
}請(qǐng)求http://127.0.0.1/name/test.html 會(huì)被代理到http://127.0.0.1/name/test.html</pre>
-
一些情況下,不能確定替換的URI
location里是正則表達(dá)式蟹肘,這種情況下词疼,proxy_pass里最好不要有URI
-
在proxy_pass前面用了rewrite,如下帘腹,這種情況下贰盗,proxy_pass是無效的,eg:
<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;">location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
proxy_pass http://127.0.0.1;
}</pre>