对于将 url 重定向到子域,距您的问题已经过去了几个月,但也许这仍然会有所帮助。
假设您使用的是 isapi_rewrite v3,试试这个:
RewriteCond %{HTTP:Host} ^www\.
RewriteRule ^/forum/(.*\.asp)$ http://archive.mywebsite.co.uk/forum/$1 [NC,R=301]
第一行查找以 www 开头的主机。(带有尾随点)。这可以确保您不会出现无限循环,将存档重定向到自身。尾随点在只做www而不是像www2这样的其他人时很挑剔。
第二行查找/forum/
,然后捕获(...)
任何字符.*
和文字点和 asp \.asp
,结束 url$
然后它会转到/forum/
文件夹中的子域(因为 /forum/ 没有被捕获,我们需要重复它),以及被捕获的 url 的整个其余部分$1
。
表示不区分大小写,因此所有这些NC
都可以大小写混合。R=301
意味着重定向,并使其成为永久的 301 重定向,因为这不是临时的。
在 v3 规则中,查询字符串参数与规则完全分开处理,因此您无需在此处执行任何操作。如果没有参数,则此方法有效。如果有参数,它们会按照您上面的问题传递。
这忽略了 http 与 https。它将重定向到http,所以如果原来是https,可能会有浏览器警告。有办法处理它,但我不想弄乱基本答案。
在我看来,将域本身放在重写规则中总是有点奇怪,因为您可能想要移动它。您可以在第一行捕获主机的其余部分,并在第二行中使用它。
RewriteCond %{HTTP:Host} ^www\.(.*)$
RewriteRule ^/forum/(.*\.asp)$ http://archive.%1/forum/$1 [NC,R=301]
这与上面类似,除了捕获 www-dot 之后的主机,到行尾(.*)$
我不确定这里是否需要 $,但它明确表明我们想要它。
RewriteCond 捕获用百分号编号,因此%1
在重写规则中替换子域之后的主机,$1
仍然意味着替换捕获的 ...asp url。