Apache 2.2下mod_rewrite扩展名重写规则无限循环问题求助
解决Apache 2.2下扩展名重写的无限循环问题
你的问题很典型——原来的规则只检查了原始请求不是存在的文件/目录,但没验证重写后的.php文件是否真的存在,这就导致当目标.php文件也不存在时,Apache会反复执行重写规则,不断给请求路径追加.php,直到达到内置的重写次数上限。
要解决这个问题,不需要移除[L]标志,只需要在现有规则基础上添加一个检查目标.php文件是否存在的条件即可。修改后的完整规则如下:
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule (.*) $1.php [L]
规则详解
RewriteCond %{REQUEST_FILENAME} !-d:跳过对现有目录的请求,避免重写目录路径RewriteCond %{REQUEST_FILENAME} !-f:跳过对现有文件的请求,比如直接访问.html或图片等静态资源时不触发重写RewriteCond %{REQUEST_FILENAME}.php -f:关键新增条件——检查当前请求路径追加.php后对应的文件是否真实存在,只有存在时才执行重写RewriteRule (.*) $1.php [L]:将请求重写为对应的.php文件,[L]标志确保当前规则匹配后不再执行后续规则(Apache 2.2下内部重写仍会重新走规则流程,但此时%{REQUEST_FILENAME}已经是存在的.php文件,第二个条件!-f不满足,不会再次触发重写,完美避免循环)
这样修改后,当你访问不存在的文件/目录时,因为对应的.php文件也不存在,第三个条件不满足,规则就不会触发,自然不会出现无限循环的问题。
内容的提问来源于stack exchange,提问作者user4447799
相关产品推荐
相关产品推荐

