为什么这个RewriteRule产生无限递归?

时间:2014-12-16 08:28:24

标签: apache .htaccess mod-rewrite rewrite

我正在尝试进行基本的URL重写,但无法使其正常运行。

我想通过我的wordpress.foobar.com文件将所有请求重定向到.htaccess到本地符号链接的WordPress安装:

RewriteEngine On

RewriteCond %{SERVER_NAME} ^wordpress\.foobar\.com$
RewriteRule ^(.*) /html/wordpress/$1 [L]

虽然我可以完美访问foobar.com/html/wordpress,但访问wordpress.foobar.com会引发500内部服务器错误。

Apache的错误日志将包含以下内容:

[error] [client 12.123.123.123] 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.

当我启用调试LogLevel时,我可以看到Apache正在尝试无限地重写favicon.ico,总是追加另一层/html/wordpress/,直到达到递归限制。

这次重写有什么问题?

2 个答案:

答案 0 :(得分:1)

使用:

RewriteCond %{SERVER_NAME} ^wordpress\.foobar\.com$
RewriteCond %{REQUEST_URI} !/html/wordpress/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /html/wordpress/$1 [L]

通过-f-d测试,您不会重定向现有文件和目录。这样,您可以避免favicon.ico的问题(如果您有该文件,我建议您添加,如果不是这样)。

答案 1 :(得分:0)

当您收到错误Request exceeded the limit of 10 internal redirects due to probable configuration error.时,请问自己一个问题:我如何设计我的规则以在某个时候终止,以及为什么它不会终止。

在您的情况下,您的规则与所有内容相匹配。条件的状态也不会改变,因此如果您的规则匹配一次,它将匹配无限次。如果您重写为确实存在的文件,这可能适用于某些设置。通过测试/html/wordpress/是否已经在网址中来阻止它重写不止一次是更安全的选择:

RewriteCond %{SERVER_NAME} ^wordpress\.foobar\.com$
RewriteCond %{REQUEST_URI} !/html/wordpress/
RewriteRule ^(.*)$ /html/wordpress/$1 [L]

除此之外,我不确定wordpress是否会识别您重写的网址。那是你要弄明白的。