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