我正在尝试使用mod_rewrite将请求重定向到123.example.com/456/file.html
到example.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/
,这使得请求成功,而不会运行任何重写规则。
我觉得我非常接近这个工作。任何帮助表示赞赏。
答案 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]