rewriterrule处理一个域两个文件夹到两个域没有文件夹



我正在尝试创建重写规则来处理一些特定的网站重定向:

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(临时)重定向,以避免潜在的缓存问题。

最新更新