我有一个 Apache 配置设置,其中有多个虚拟主机作为子域。我刚刚购买了一个新域名,我希望对此域名的所有请求都重定向到新域名,包括子域:
old.com > new.com
sub.old.com > sub.new.com
有没有什么简单的方法可以做到这一点httpd.conf
?
答案1
我已经有一段时间没有写过 RewriteRule 了,下面是我对此的解释:
RewriteEngine on
RewriteCond %{HTTP_HOST} (.+\.)?old\.com$ [NC]
RewriteRule (.*) http://%1new.com$1 [R]
将其放置在 old.com 的基于名称的虚拟主机中。以下是思考过程,如果我有点生疏,您可以尝试自己纠正它:
RewriteCond
分解:
RewriteCond
匹配所有传入主机,前缀为“一个或多个字符后跟一个文字点”,后跟 old.com。点位于括号内,因为除非提供子域组件,否则它不会出现。- 反斜杠是为了逃避点的含义。(使它们成为文字)
- 指定
?
括号中包含的所有内容都是可选的。(子域组件) - 该
$
字符将正则表达式固定到字符串的末尾,以防止过早匹配的异常。 - 该
[NC]
标志强制不区分大小写。 - 由于虚拟主机将确保每个字符串都包含匹配模式,因此此匹配本身不执行任何操作。重要的是,括号将捕获即将到来的主机标头的子域组件
RewriteRule
。
RewriteRule
分解:
- 使用 捕获传入请求的整个 URI
(.*)
。 - 跳过前面的内容,该
[R]
标志指定了重定向操作。 - 重定向 URL 有两种替换:
- 第一个是
%1
,这是 捕获的第一个字符串RewriteCond
。在本例中,它应该是域后缀。new.com 之前没有前缀点,这一点很重要:可能没有子域组件,在这种情况下不应该有点。该点应该作为 RewriteCond 正则表达式的一部分被捕获。
- 第一个是
- 第二个是
$1
,它与 捕获的第一个字符串匹配RewriteRule
。这应该是用户尝试在子域下访问的 URI。
- 第二个是
如果有人指出了一种避免使用 RewriteRule 的解决方案,那么向他们表示祝贺:您应该尽可能选择它作为您的解决方案。mod_rewrite
适用于当您缺乏专用配置指令提供的更优雅的解决方案时。
我还应该指出,此示例仅执行非 HTTPS 重定向,并且不考虑 Web 服务器是否正在使用备用端口。您可能需要进一步调整以满足诸如此类的特殊需求,但这是一个起点。