我目前正在开发一个可与通配符子域一起使用的应用程序。
例如:
customer1.domain.com
customer2.domain.com
因此,我们为* .domain.com购买了通配符SSL证书,并将所有子域从http重定向到https。
到目前为止,如此简单,但是现在我们有一些客户在其浏览器中手动键入www.customer1.domain.com,因为该客户不存在虚拟主机。
我现在想做的是,将所有请求从http://www.wildcard.domain.com重定向到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}$1 [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]联接的,所以如果这两个条件中的任何一个返回true,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,该URL由以下部分组成:
https://www。
%1:对主机的非www部分的引用
%{REQUEST_URI}:请求的URI,不包含主机名
所有这些令牌都连接在一起,并代表最终的重定向URI。最后,我们附加3个标志:
NE不转义特殊字符
R = 301以使用HTTP 301重定向状态
L停止处理其他规则,并立即重定向
关于apache - Apache重定向通配符子子域到子域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46001519/