nginx rewrite 不加break和加break的区别

浏览:52日期:2022-07-25

问题描述

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

问题解答

回答1:

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

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

相关文章: