在htaccess文件中创建mod_rewrite规则

时间:2011-02-21 21:13:57

标签: .htaccess mod-rewrite redirect subdirectory

我正在尝试创建一个mod_rewrite规则来将人们引导到子文件夹。目前代码如下:

RewriteEngine On

RewriteCond %{HTTP_HOST} abcsite.com$ [OR,NC]
RewriteCond %{HTTP_HOST} ^!www\.abcsite\.*$ 
RewriteCond %{REQUEST_URI} !^/abc/.*$ 
RewriteRule (.*)$ /abc/$1 [L]

如果用户键入www.abcsite.com,则重定向有效,但如果他们键入abc.com,则无效。是否有一些我缺少或应该做的不同以确保用户转到正确的文件夹(无论他们如何键入URL)?

附注:我正在处理的htaccess文件是一个Joomla文件,因此它的所有内容都与另一个Joomla网站有关。我很感激帮助。

2 个答案:

答案 0 :(得分:0)

因为你有条件。

RewriteCond %{HTTP_HOST} abcsite.com$ [OR,NC]
RewriteCond %{HTTP_HOST} ^!www\.abcsite\.*$ 
RewriteCond %{REQUEST_URI} !^/abc/.*$ 

以上所有规则只会通过其abcsite.com

您还可以添加以下规则,然后它也适用于abc.com。

RewriteCond %{HTTP_HOST} abc.com$ [OR,NC]
RewriteCond %{HTTP_HOST} ^!www\.abc\.*$ 
RewriteCond %{REQUEST_URI} !^/abc/.*$ 
RewriteRule (.*)$ /abc/$1 [L]

答案 1 :(得分:0)

在你的第二个条件下有一个迷路!。模式前面的!表示当正则表达式匹配时条件为真(如在第三个条件中)。模式中的!只是一个文字符号。

主机条件应该是这样的:

RewriteCond %{HTTP_HOST} ^abcsite\.com$ [OR,NC]
RewriteCond %{HTTP_HOST} ^www\.abcsite\.com$ [NC]

事实上,他们可以加入一个条件(注意,这里没有[OR]):

RewriteCond %{HTTP_HOST} ^(www\.)?abcsite\.com$ [NC]

您的第三个条件旨在阻止重定向循环(/foo/abc/foo/abc/abc/foo→...)。它的含义是,如果请求URL以/abc/开头,则不会应用该规则。但是,您的实际重定向是内部重定向:如果用户访问abcsite.com/foo,服务器会在内部将其重写为/webroot/abc/foo,但REQUEST_URI保持不变,/foo

这不会导致重定向循环的原因很可能是abc/.htaccess中的重写规则,一旦完成重定向,它会覆盖此规则。

在第三个条件中应该检查的是重写规则匹配的路径:

RewriteCond $1 !^abc/
RewriteRule (.*) /abc/$1 [L]