我正在尝试创建重写规则来处理一些特定的网站重定向:
I would like domain1.ca/folder1/xyz转到域2.ca/xyz和域1.ca/folder2/xyz转到域3.ca/xyz
现在我的尝试如下:
RewriteCond %{HTTP_HOST} ^domain1.ca$ [OR]
RewriteCond %{HTTP_HOST} ^www.domain1.ca$
RewriteRule ^(/folder1/)(.*)$ "https://domain2.ca/$1" [R=301,L]
RewriteCond %{HTTP_HOST} ^domain1.ca$ [OR]
RewriteCond %{HTTP_HOST} ^www.domain1.ca$
RewriteRule ^(/folder2/)(.*)$ "https://domain3.ca/$1" [R=301,L]
任何帮助都将非常感激:)谢谢。
现有规则的几个问题:
-
在
.htaccess
中,RewriteRule
模式匹配的url路径不以斜杠开头。因此,url路径从folder1/xyz
开始,而不是从/folder1/xyz
开始。 -
您不必要地捕获了"文件夹"在第一个带括号的子模式中,并在替换字符串中使用它(即。
$1
)。您应该使用$2
,或者不捕获第一个路径段。
这些指令也可以稍微整理一下(例如:不需要在正则表达式中使用反斜杠-转义斜杠和条件(可以组合使用)。
试试下面的命令:
RewriteCond %{HTTP_HOST} ^(www.)?domain1.ca [NC]
RewriteRule ^folder1/(.*) https://domain2.ca/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^(www.)?domain1.ca [NC]
RewriteRule ^folder2/(.*) https://domain3.ca/$1 [R=301,L]
其他说明:
- 在
RewriteRule
模式中,(.*)$
之后的字符串结束锚($
)是不需要的,因为regex默认是贪婪的。 - 只有当参数包含空格时,才需要用双引号括住参数。
- 我从CondPattern的末尾删除了字符串结束锚(
$
),以匹配以点结尾的完全限定域名。 - 我在条件中添加了
NC
标志。从技术上讲,一些机器人可以发送混合/大写Host
标头。
先测试302(临时)重定向,以避免潜在的缓存问题。