1

我想将 test.com 重写为 test.com/context。

浏览器返回重定向递归错误。

有人有线索吗?

我把下面的httpd-vhosts.conf。

<VirtualHost *:80>
    ServerName test.com

    JkMount /* mschoi
    ErrorLog logs/mschoi-error_log
    CustomLog logs/mschoi-acces_log common

    RewriteEngine On
    RewriteRule ^/(.*)$ /context/$1 [L,R]

</VirtualHost>

httpd.conf
Include conf/extra/httpd-vhosts.conf
4

1 回答 1

2

这是您的规则/context在重写时再次匹配的简单案例。您可以使用 aRewriteCond来避免它:

RewriteEngine On
# Rewrite only if the request doesn't already match /context
RewriteCond %{REQUEST_URI} !^/context
RewriteRule ^/(.*)$ /context/$1 [L,R]

如果正在访问的文件确实存在(而不是重写模式),您可以测试而不重写任何真实的现有文件:

RewriteEngine On
# If the requested resource is not actually a real file or directory (doesn't exist)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*)$ /context/$1 [L,R]

评论后编辑以解释:

不仅每个目录的规则会导致递归。在这种情况下,/(.*)匹配任何内容并无条件附加到/content. 由于[R]存在用于重定向的标志,并且每个都是一个新请求,因此它变成了一个重定向链:

/something
/content/something
/content/content/something
/content/content/content/something

随后的重定向始终继续匹配前导/content以及后面的内容并附/(.*)加到它。

于 2013-01-16T14:05:31.660 回答