我目前正在开发一个可以使用通配符子域构建的应用程序。
例如:
customer1.domain.com
customer2.domain.com
因此,我们为* .domain.com购买了通配符SSL证书,并将所有子域名从http重定向到https。
到目前为止,这么简单,但现在我们有客户在他们的浏览器中手动输入www.customer1.domain.com,因为这不存在vhost。
我现在要做的是,将所有请求从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>
我们对HTTPS上同一目标的所有HTTP请求的重定向如下:
<Virtualhost {{IP-ADRR}}:80>
ServerName %1.domain.com
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
答案 0 :(得分:1)
重定向的解决方案是:
<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。,因为模式是正则表达式而且。 dot在这里有特殊含义,因此必须进行转义。
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
第四行是我用来避免直接在URL中引用主机名的方便行。它匹配传入请求的主机,并将其分解为www部分(如果有),以及主机名的其余部分。我们稍后会在RewriteRule中使用%1引用它。
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
RewriteRule是重定向的核心。通过这一行,我们告诉Apache将任何请求重定向到新的URL,由以下内容组成:
所有这些令牌都连接在一起,代表最终的重定向URI。最后,我们附加3个标志: