Mod rewrite mod_rewrite:重定向到与域同名的文件夹

Mod rewrite mod_rewrite:重定向到与域同名的文件夹,mod-rewrite,redirect,Mod Rewrite,Redirect,我有一堆域指向同一个文件夹,我的主机“public_html”的根。 我希望我可以重定向它们,每个都指向与域同名的文件夹 例如:将www.mydomain.com重定向到“public_html/www.mydomain.com” 我试过这个: RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST}/.*$ RewriteRule ^(.*)$ /%{HTTP_HOST}/$1 [L] 但是没有成功。

我有一堆域指向同一个文件夹,我的主机“public_html”的根。 我希望我可以重定向它们,每个都指向与域同名的文件夹

例如:将www.mydomain.com重定向到“public_html/www.mydomain.com”

我试过这个:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST}/.*$
RewriteRule ^(.*)$  /%{HTTP_HOST}/$1 [L]
但是没有成功。发生了什么? 甚至可以重定向到名称上使用“点”的文件夹


感谢高级。

您的RewriteCond中的测试模式实际上正在尝试匹配以文本字符串
/%{HTTP\u HOST}/
开头的输入。
%{HTTP_HOST}
变量的值没有像您期望的那样展开,因此条件将始终为true(模式本身永远不会匹配)。您需要修改RewriteCond,有几种不同的方法

如果这是您执行的唯一重写,您只需检查是否已完成:

RewriteCond %{ENV:REDIRECT_STATUS} =""
或者,如果资源在重写之前不存在,则可以改为检查:

RewriteCond %{REQUEST_FILENAME} !-f
最后,您可以通过在测试模式中使用反向引用以及URL中不会出现的分隔符来模拟原始条件:

RewriteCond /%{HTTP_HOST}/#%{REQUEST_URI} !^([^#]+)#\1

请注意,这并不能保证您已经完成了重定向,它只确保请求URI具有主机名作为其第一个路径段。不过,一般来说,这已经足够好了。

你的重写条件看起来很可疑,“!”表示否定,你的意思是,你不希望重写应用于任何与主机匹配的请求,斜杠,然后是任何文本,据我所知,你实际上是说没有URL会匹配,因此规则永远不会被应用。我试图建议的是:如果%{REQUEST\u URI}NOT(!)^/%{HTTP\u HOST}/*$RewriteRule^(.*$/%{HTTP\u HOST}/$1[L]。如何扩展HTTP\u HOST变量以用于重定向?这是可能的,还是我必须为每个域/文件夹显式地编写条件?@DenisBrat它将在替换字符串中展开自身,因此没有问题;你的规则应该很好。mod_rewrite不会扩展测试模式中的变量(它们是预先编译的)。基本上,您可以在左侧参数上使用%{HTTP_HOST}(和其他变量)来重写cond,在右侧参数上使用%{HTTP_HOST}来重写rule。其他任何地方都可能不会像您期望的那样工作。@Tim Stone出于某种原因,如果我放置RewriteCond%{ENV:REDIRECT_STATUS}=“在你上次给我写之前,它不起作用。然而,如果我脱下它,它工作得很好!但现在如果我尝试访问子文件夹,它会将我的域重定向到www.mydomain.com/www.mydomain.com/subfolder。“这与测试模式有关吗?”DenisBrat啊,我错了。
不应该出现在那里。您希望子文件夹去哪里(这种行为有什么问题)?如果检查文件是否存在,
RewriteCond%{REQUEST_FILENAME}-d
可能还需要检查目录是否存在。