首頁  >  問答  >  主體

nginx rewrite 不加break和加break的差別

配置nginx rewrite時發現的一個問題

if (!-e $document_root$fastcgi_script_name) {
    rewrite ^.*$ /404.html break;
}

這時候是正常的,但去掉break後,

if (!-e $document_root$fastcgi_script_name) {
    rewrite ^.*$ /404.html;
}

這時候就報錯了

rewrite or internal redirection cycle while processing "/404.html

#請問加和不加break有什麼差別,不加break時,rewrite之後又發生了什麼事?求大神解惑

--------更新---------

404.html檔案是存在的

當我把break改成last的時候,還是會報上面的錯誤,所以我認為,不加break或將break換成last,當uri匹配到上述的rewrite後,就會重新去匹配location塊,但是變數($document_root , $fastcgi_script_name ...)值等等都沒有變化,導致再次進入if塊,如此循環下去直至超過10次,然後報500錯誤

--------再更新---------

經過更多的測試後發現,在location塊裡面,如果rewrite之後不加break flag或者rewrite 之後有last flag,那麼rewrite之後會重新選擇location塊,如果仍然進入原先所在的location塊,那麼變量($document_root , $fastcgi_script_name ...)是不會改變的,但是如果rewrite之後重定向到別的location區塊後,這時候變數就會改變

習慣沉默習慣沉默2714 天前612

全部回覆(1)我來回復

  • 習慣沉默

    習慣沉默2017-05-16 17:11:28

    不加 break 就不會停止,繼續找下一個 rewrite 規則。

    把所有請求 rewrite 到了 404.html,如果 404.html 也不存在,就死循環了。

    回覆
    0
  • 取消回覆