Apache 重定向域和所有子域

Oli*_*Ash 4 domain subdomain virtualhost apache-2.2

我有一个 Apache 配置设置,其中多个虚拟主机作为子域。我刚刚购买了一个新域名,我希望对这个域名的所有请求都重定向到新域名,包括子域:

old.com > new.com
sub.old.com > sub.new.com
Run Code Online (Sandbox Code Playgroud)

有没有什么简单的方法可以在里面做到这一点httpd.conf

And*_*w B 5

我已经有一段时间没有写 RewriteRule 了,但这是我的破解:

RewriteEngine on

RewriteCond %{HTTP_HOST} (.+\.)?old\.com$ [NC]
RewriteRule (.*) http://%1new.com$1 [R]
Run Code Online (Sandbox Code Playgroud)

将它放在 old.com 的基于名称的虚拟主机中。这是思考过程,如果我有点生疏,你可以自己纠正它:

RewriteCond 分解:

  • RewriteCond匹配所有传入主机的前缀为“一个或多个字符后跟一个文字点”,后跟 old.com。点在括号内,因为除非提供了子域组件,否则它不会出现。
  • 反斜杠是为了逃避点的意义。(使它们字面意思)
  • ?一切都包含在括号指定是可选的。(子域组件)
  • $字符将正则表达式锚定到字符串的末尾,以防止过早的匹配异常。
  • [NC]标志强制这不区分大小写。
  • 由于虚拟主机将确保每个字符串都包含一个匹配的模式,所以这个匹配本身什么都不做。重要的是括号将捕获即将到来的传入主机标头的子域组件RewriteRule

RewriteRule 分解:

  • 使用 捕获传入请求的整个 URI (.*)
  • 向前跳过,该[R]标志指定重定向操作。
  • 重定向 URL 有两个替换:
    • 第一个是%1,它是由 捕获的第一个字符串RewriteCond。在这种情况下,它应该是域后缀。在 new.com 之前缺少前缀点很重要:可能没有子域组件,在这种情况下应该没有点。该点应该作为 RewriteCond 正则表达式的一部分被捕获。
    • 第二个是$1,它匹配由 捕获的第一个字符串RewriteRule。这应该是用户试图在子域下访问的 URI。

如果有人指出了避免使用 RewriteRule 的解决方案,请向他们致敬:您应该尽可能将其作为您的解决方案。mod_rewrite当您缺乏由专用配置指令提供的更优雅的解决方案时。

我还应该注意,这个例子只会做非 HTTPS 重定向,并没有考虑网络服务器是否正在使用替代端口。您可能需要针对诸如此类的特殊需求进一步调整,但这是一个起点。