Apache 重定向域及其所有子域

Apache 重定向域及其所有子域

我有一个 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 服务器是否正在使用备用端口。您可能需要进一步调整以满足诸如此类的特殊需求,但这是一个起点。

相关内容