apache重写与虚拟主机有递归

时间:2013-01-16 07:42:27

标签: apache mod-rewrite

我想将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

1 个答案:

答案 0 :(得分:2)

这是一个简单的例子,当你重写时,你的规则再次匹配/context。您可以使用RewriteCond来避免它:

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以及/(.*)后面的内容保持匹配并附加到其中。