一、last 和 break 總結如下:
(1)、last 和 break 當出現在location 之外時,兩者的作用是一致的沒有任何差異。
注意一點就是,他們會跳過所有的在他們之後的rewrite 模塊中的指令,去選擇自己匹配的location
Example:
rewrite url1 url2 last; ① rewrite url3 url4 last; ② rewrite url5 url6 last; ③ location ~ url2 ④ location ~ url4 ⑤ location ~ url6 ⑥
當① 這條rewrite 規則生效後,它後面的②和③ 將被跳過不做判斷,而去直接選擇 後面的location。
這裏可能有一個疑問,那些指令輸入rewrite 模塊中的指令呢? 若是使用nginx本身,你就要到官網上去查詢了。
但如果你使用的是tengine ,可以使用tengine -V 。會將你想要的信息列舉出來。
(1)、last 和 break 當出現在location 內部時,兩者就存在了差異。
last: 使用了last 指令,rewrite 後會跳出location 作用域,重新開始再走一次剛剛的行爲
break: 使用了break 指令,rewrite後不會跳出location 作用域。它的生命也在這個location中 終結。
Example:
rewrite xxx1 yyy last; ⑦ rewrite xxx2 yyy last; ⑧ rewrite xxx3 yyy last; ⑨ rewrite xxx4 yyy last; ⑩ location ~ url1 { rewrite url1 url2 last; ① } location ~ url2 { rewrite url3 url4 break; ② fastcgi_pass 127.0.0.1:9000; }
以上事例:
第一個location 中的 rewrite 指令處理完成之後,會跳出location ,再重新判斷rewrite 7 ~ 9 的規則。
第二個location 中的 rewrite 指令處理完成之後,不會跳出location, 更不會重新判斷rewrite 7 ~ 9 的規則。而只能將
信息傳遞給後面的fastcgi_pass 或者proxy_pass 等指令
二、permanent 和 redirect 總結如下:
permanent: 大家公認的信息 ,永久性重定向。請求日誌中的狀態碼爲301
redirect: 大家公認的信息 ,臨時重定向。請求日誌中的狀態碼爲302
從實現功能的角度上去看,permanent 和 redirect 是一樣的。不存在哪裏好,哪裏壞。也不存在什麼性能上的問題。
但從SEO(或者是百度爬你的網站時)。 類似於這樣的東西,會對你到底是永久性重定向還是臨時重定向感興趣。瞭解不到,需要深入,就google 吧。
三、last 和 break VS permanent 和 redirect
在 permanent 和 redirect 中提到了 狀態碼 301 和 302。 那麼last 和 break 想對於的訪問日誌的請求狀態碼又是多少呢?
答案爲: 200
這兩類關鍵字,我們能夠眼睛看到的差異是什麼呢? 我舉個例子說明吧:
當你打開一個網頁,同時打開debug 模式時,會發現301 和 302 時的行爲是這樣的。第一個請求301 或者 302 後,瀏覽器重新獲取了一個新的URL ,然後會對這個新的URL 重新進行訪問。所以當你配置的是permanent 和 redirect ,你對一個URL 的訪問請求,落到服務器上至少爲2次。
而當你配置了last 或者是break 時,你最終的URL 確定下來後,不會將這個URL返回給瀏覽器,而是將其扔給了fastcgi_pass或者是proxy_pass指令去處理。請求一個URL ,落到服務器上的次數就爲1次。