我今天一直在寻找,但由于我有限的 mod_rewrite 和正则表达式知识,我很挣扎。
我想要实现的是将域 1(包括子域)重写为域 2(包括子域),并将其实现为 301。域 2 是主域,域 1 只是(暂时)与其并列设置,实际上只是因为“它存在”(更好的用途尚待确定,我想在此期间用它来学习一些东西)。
域 2 配置为通配符,并托管通过子域 -> 子文件夹内部重写显示的微型网站。(很乐意根据要求发布此代码,这并不棘手,但出于某些奇怪的原因,我确实花了一段时间才让它在没有无限重写的情况下工作)。域 1(临时域)根本没有设置,但只是因为我面临几个选项(DirectAdmin 实现的“别名”或“指针”,或添加为单独的域并配置为通配符)。如果有人进入域 1(转发域),应该会发生以下情况:
http://sub.domain1.tld -> http://sub.domain2.tld
http://sub.domain1.tld/content.php -> http://sub.domain2.tld/content.php
http://domain1.tld -> http://domain2.tld
http://domain2.tld
让我感到困扰的是,网络上所有现成的解决方案要么将子域名映射到目录,要么仅编码以处理通过的请求http://domain1.tld/
。我自己的一个旧 htaccess 文件用于将 .co.uk 重定向到 .com,其中有我想要去的地方的开头:
RewriteCond %{HTTP_HOST} ^(www\.)?([^\.]+)\.foo\.com [NC]
RewriteRule ^(.*)$ http://foo.co.uk/$1 [R=301,L]
我理解这$1
表示域之后的所有内容与模式匹配^(.*)$
,并且%2
是子域(所以我假设%1
如果它存在于 http_referer 中则是“www.”否则为空?)
...然而,这就是我被困住的地方。最好的重写方法是什么,以便将所有变量传递到新域名 - 并且不会在此过程中丢失任何子域?
答案1
是否有理由重定向将不起作用,在域 1 的配置中:
Redirect permanent / http://domain2.com/
Redirect
将 LHS 下的所有内容重定向到 RHS,保持相同的目录结构。
或者,一个更简单的解决方案是仅添加ServerAlias domain2
域 1 的配置,尽管这不会发送重定向,但只是让服务器以与域 1 相同的方式响应域 2 的请求。
答案2
尝试以下方法(未经测试):
RewriteMatch 301 http://(.*)domain1.com(.*) http://$1domain2.com$2
答案3
我想你想要这样的东西:
RewriteCond %{HTTP_HOST} ^((www\.)?[^\.]+)\.foo\.com [NC]
RewriteRule ^(.*)$ http://%1.foo.co.uk/$1 [R=301,L]
这将保留 %1(foo.com 的子域部分,包括 www(如果存在))并将其放入 的 RHS 中RewriteRule
。请记住,在mod_rewrite
对其进行处理时,这些只是字符串,因此您可以对它们进行任何操作。
如果可选的 www 部分给您带来问题,请将其拆分为两个RewriteCond
语句:
RewriteCond %{HTTP_HOST} ^(www\.[^\.]+)\.foo\.com [NC] [OR]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.foo\.com [NC]
RewriteRule ^(.*)$ http://%1.foo.co.uk/$1 [R=301,L]