mod_rewrite将docroot的子目录作为子域提供

时间:2012-02-14 19:21:14

标签: apache mod-rewrite

我正在尝试使用mod_rewrite将请求重定向到123.example.com/456/file.htmlexample.com/123/456/file.html。重写是必要的,因为可以动态创建新目录。我试图通过它来推理,但似乎无法找到一个有效的解决方案。

首先,如果我使用下面的重写规则,我会得到一个404 所有,因为它成功运行第二个规则,进行内部重定向,再次运行规则并且第一个规则匹配,因为它是寻找123/123/456/file.html,导致404。

RewriteCond %{HTTP_HOST} ^(\d+)\.
RewriteCond %{DOCUMENT_ROOT}/%1/$1 !-d
RewriteCond %{DOCUMENT_ROOT}/%1/$1 !-f
RewriteRule (.*) - [R=404,L]

RewriteCond %{HTTP_HOST} ^(\d+)\.
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -d [OR]
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -f
RewriteRule (.*) /%1/$1 [L]

如果我将404移到最后,我会得到以下内容:

RewriteCond %{HTTP_HOST} ^(\d+)\.
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -d [OR]
RewriteCond %{DOCUMENT_ROOT}/%1/$1 -f
RewriteRule (.*) /%1/$1 [L]

RewriteCond %{DOCUMENT_ROOT}/$1 !-d
RewriteCond %{DOCUMENT_ROOT}/$1 !-f
RewriteRule ^(.*)$ - [R=404,L]

几乎可以正常工作,但是当你输入123.example.com/123/时它不会404,即使它应该是无效的。由于路径未被第一条规则重写,$1评估为123/而不是无效路径123/123/,这使得请求成功,而不会运行任何重写规则。

我觉得我非常接近这个工作。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

在第一组规则之前添加以下RewriteCond,如下所示,以防止内部重定向

#prevent internal redirects
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{HTTP_HOST} ^(\d+)\.
RewriteCond %{DOCUMENT_ROOT}/%1/$1 !-d
RewriteCond %{DOCUMENT_ROOT}/%1/$1 !-f
RewriteRule (.*) - [R=404,L]