我正在尝试创建一个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网站有关。我很感激帮助。
答案 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]