搜索

首页  >  问答  >  正文

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块后,这时候变量就会改变

習慣沉默習慣沉默2746 天前648

全部回复(1)我来回复

  • 習慣沉默

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

    不加 break 就不会停止,继续找下一个 rewrite 规则。

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

    回复
    0
  • 取消回复