Apache 重定向通配符子域到子域

Apache Redirect Wildcard sub- subdomain to subdomain

我目前正在开发一个应用程序,该应用程序是为使用通配符子域而构建的。

例如:

所以我们为 *.domain.com 购买了通配符 SSL 证书,并将所有子域从 http 重定向到 https。

到目前为止,很简单,但现在我们有客户在他们的浏览器中手动输入 www.customer1.domain.com,因为这不存在虚拟主机。

我现在要做的是,重定向来自http://www.wildcard.domain.com to https://wildcard.domain.com

的所有请求

我们的虚拟主机看起来像:

<VirtualHost {{IP-ADRR}}:443>
  Servername %1.domain.com
  VirtualDocumentRoot /path/to/webroot/%0
  Include  /etc/httpd/conf/options-ssl-standard.conf
</VirtualHost>

我们将所有 HTTP 请求重定向到 HTTPS 上的同一目标,如下所示:

<Virtualhost {{IP-ADRR}}:80>
  ServerName %1.domain.com
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^(.*)$ https://%{HTTP_HOST} [R=301,L]
</VirtualHost>

重定向的解决方案是:

<Virtualhost {{IP-ADRR}}:80>
  ServerName %1.domain.com
  RewriteEngine On
  RewriteCond %{HTTPS} off [OR]
  RewriteCond %{HTTP_HOST} ^www\. [NC]
  RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
  RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
</VirtualHost>

解释:

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]

这两行是重定向条件,用于判断请求是否应该重定向。因为条件是用 [OR] 连接的,如果这两个条件中的任何一个 returns 为真,Apache 将执行重写规则(重定向)。

第一个条件确定请求是否使用非 HTTPS URL。第二个条件确定请求是否使用 www URL。请注意,我使用了 www\.而不是 www.,因为该模式是一个正则表达式,而 .点在这里有特殊含义,因此必须转义。

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]

第四行是我用来避免直接在 URL 中引用主机名的方便行。它匹配传入请求的主机,并将其分解为 www 部分(如果有)和主机名的其余部分。稍后我们将在 RewriteRule 中使用 %1 引用它。

RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

RewriteRule 是重定向的核心。通过这一行,我们告诉 Apache 将任何请求重定向到一个新的 URL,由:

组成
  • https://www.
  • %1: 引用主机的非 www 部分
  • %{REQUEST_URI}:请求的 URI,没有主机名

所有这些标记连接在一起,代表最终的重定向 URI。最后,我们附加 3 个标志:

  • NE 不转义特殊字符
  • R=301 使用 HTTP 301 重定向状态
  • L 停止处理其他规则,并立即重定向