靈活應(yīng)用Nginx Rewrite:實戰(zhàn)經(jīng)驗與實用方法
Nginx Rewrite順序優(yōu)先級
?
location?=)?>?(location?完整路徑)?>?(location?^~?路徑)?>?(location?~,~*?正則順序)?>?(location?部分起始路徑)?>?(/)
具體而言,當 Nginx 匹配請求 URL 時,先按照完全匹配(location =)進行匹配,然后是完整路徑匹配(location 完整路徑),接著是路徑前綴匹配(location ^~ 路徑),再然后是正則表達式匹配(location?,* 正則順序),最后是部分起始路徑匹配(location 部分起始路徑),如果都沒有匹配成功,則使用 / 作為默認匹配。
Nginx Rewrite Flag
Nginx Rewrite 指令中的 flag 用于控制重寫操作的行為,常見的 flag 有以下幾種:
last:相當于 Apache 中的 [L] 標記,表示完成重寫操作,并跳過后續(xù)的 Rewrite 指令,直接選擇下一個匹配的 location 進行處理。
break:終止當前匹配,不再執(zhí)行后續(xù)的 Rewrite 指令,并使用當前重寫后的 URL 進行請求處理。
redirect:返回 302 臨時重定向,地址欄會顯示跳轉(zhuǎn)后的 URL,對搜索引擎爬蟲來說不會更新 URL(因為是臨時重定向)。
permanent:返回 301 永久重定向,地址欄會顯示跳轉(zhuǎn)后的 URL,對搜索引擎爬蟲來說會更新 URL(因為是永久重定向)。
last 和 break 在使用上區(qū)別:
last 和 break 當出現(xiàn)在 location 塊之外時:
兩者的作用是一致的沒有任何差異,?他們會跳過所有的在他們之后的?rewrite?模塊中的指令,?去選擇自己匹配的location.
不寫last和break,?會優(yōu)先執(zhí)行rewrite部分,?然后才會去匹配?location?塊.?
last 和 break 當出現(xiàn)在 location 塊內(nèi)部時
?break:?url重寫后,?直接使用當前資源,?終止當前location的rewrite檢測,?而且不再進行location匹配,?完成本次請求,?地址欄url不變.?
?last:??url重寫后,?馬上發(fā)起一個新的請求,?再次進入server塊,?重試location匹配,?超過10次匹配不到報500錯誤,?地址欄url不變.?
?不寫last和break,?那么流程就是依次執(zhí)行這些rewrite.
例子
如下 Nginx配置,回答下面3個問題
1 當 1 這條rewrite 規(guī)則生效后, 2,3,4規(guī)則將會如何處理。
2 當 5 這個 rewrite 指令處理完成之后,將會如何處理請求。
3 第二個location 中的 rewrite(6)指令處理完成之后,將會如何處理請求。
rewrite?xxx1?yyy?last;?1
rewrite?xxx2?yyy?last;?2
rewrite?xxx3?yyy?last;?3
rewrite?xxx4?yyy?last;?4
?
location?~??url1
{
????rewrite?url1?url2?last;?5?
}
?
location?~??url2
{
????rewrite?url3?url4?break;??6
????fastcgi_pass?127.0.0.1:9000
}
當 1 這條rewrite 規(guī)則生效后, 它后面的2,3,4將被跳過不做判斷, 而去直接選擇 后面的location.
當 5 這個 rewrite 指令處理完成之后, 會跳出location, 再重新判斷rewrite 1-4 的規(guī)則.
第二個location 中的 rewrite(6)指令處理完成之后, 不會跳出location, 更不會重新判斷rewrite 1 ~ 4 的規(guī)則. 而只能將信息傳遞給后面的 fastcgi_pass 或者 proxy_pass 等指令。
Nginx請求匹配到下面的localtion會返回404嗎
location?/eoc?{
????rewrite?^?$request_uri;
????rewrite?^/eoc/(.*)$?/$1?break;
????rewrite?^/eoc?break;?
????return?404;
????proxy_pass?http://127.0.0.1:18002$uri;?
????proxy_http_version?1.1;
????add_header?Cache-Control?'public,?max-age=0';
}
根據(jù) Nginx 的請求處理過程,當執(zhí)行了 return 指令時,后續(xù)的rewrite和return指令不會執(zhí)行,而是將其扔給了 fastcgi_pass 或者是 proxy_pass 指令去處理,而不會執(zhí)行"return 404;"。因此,配置中的"return 404;"不會被執(zhí)行。