2016 07 08 Apache mod_rewrite: PHP 重写引起的递归错误 - huyx/1 GitHub Wiki
问题
下面一个 .htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]
当访问一个不存在的资源时,出现的不是 404 错误,而是 500 错误,查看 Apache 日志文件,发现错误信息:
... AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' ...
显然是发生了重写的递归。
解决方法1
一种是网上的方法,在前面增加语句消除循环:
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
解决方法2
因为是在资源不存在时才出现错误,所以可以在 RewriteRule 之前增加对 .php 是否存在的检测,只有 .php 文件存在时才进行重写:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]
注意其中的:
RewriteCond %{REQUEST_FILENAME}.php -f