我正在通过一个网站的 MAMP 设置本地环境,几个月前我从网络上删除了该网站,以便查看该网站上的一些旧功能,目前我在 apache_error.log 中收到以下错误文件。
Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: http://localhost:8888/
我在其他帖子中寻找了解决方案(例如 由于可能的配置错误,请求超出了 10 个内部重定向的限制),我知道这与我的 .htaccess 文件有关。但是,由于我的文件相当具体,我无法找出问题所在。这是(为了保护隐私,我将网站名称更改为 example.com):
Options FollowSymlinks
RewriteEngine On
RewriteRule ^demo/ - [L]
RewriteRule ^\.htaccess$ - [F]
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]
RewriteCond %{REQUEST_URI} =""
RewriteRule ^.*$ example/public/index.php [NC,L]
RewriteCond %{REQUEST_URI} !^/public/.*$
RewriteRule ^(.*)$ example/public/$1
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^.*$ - [NC,L]
RewriteRule ^public/.*$ example/public/index.php [NC,L]
这可能不太可能,但如果有人能看一下并提供可能导致错误的原因,我将永远感激不已。
我在我的
.htaccess
文件中遇到过很多 RewriteRules 的情况。最直接的方法是在该域/站点的 .conf
文件中添加一行以增加限制,因为 10 有点紧张。使用 LimitInternalRecursion
后接一个更大的数字。
例如,我有两个网站:
LimitInternalRecursion 100
(一个网站有很多屏蔽规则)
LimitInternalRecursion 500
(一个大量使用 ajax 的 SSL 站点,具有大量重定向以强制执行 https 而不是 http)
一个好的经验法则是 RewiteRules 越多,数字越高,特别是如果您的 RewriteRules 执行大量阻塞时。
如果您仍然希望缩减 RewritesRules,我会选择(对于 Apache 2.2):
<FilesMatch "\.(htaccess|htpasswd|ini|phps|psd|log|sh|eye)$">
Order Allow,Deny
Deny from all
</FilesMatch>
(
Require all denied
对于 Apache 2.4)
而不是
RewriteRule ^\.htaccess$ - [F]
来保护 .htaccess 和其他文件(例如 .ini、.log、.psd、.sh、.eye 等)。这使您可以更灵活地阻止其他文件。
更新:
今天在阅读 Apache 文档时了解其他内容,我了解到
LimitInternalRecursion
将采用两个数值,第一个数字表示最大重定向数量,第二个数字表示“子请求可以嵌套的深度”(阅读 LimitInternalRecursion ),类似:
LimitInternalRecursion 100 20
将更好地调整指令。
仅存在一个数字,Apache 会假设这两个值都为该数字,因此:
LimitInternalRecursion 500
将被 Apache 读取为:
LimitInternalRecursion 500 500
这有点极端...