Apache 重定向通配符子域到子域
Apache Redirect Wildcard sub- subdomain to subdomain
我目前正在开发一个应用程序,该应用程序是为使用通配符子域而构建的。
例如:
customer1.domain.com
customer2.domain.com
所以我们为 *.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 停止处理其他规则,并立即重定向
我目前正在开发一个应用程序,该应用程序是为使用通配符子域而构建的。
例如:
customer1.domain.com
customer2.domain.com
所以我们为 *.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 停止处理其他规则,并立即重定向