Apache将通配符子域重定向到子域
我目前正在开发一个用于通配符子域的应用程序 例如:Apache将通配符子域重定向到子域,apache,ssl,url-rewriting,hosting,wildcard-subdomain,Apache,Ssl,Url Rewriting,Hosting,Wildcard Subdomain,我目前正在开发一个用于通配符子域的应用程序 例如: customer1.domain.com customer2.domain.com 因此,我们为*.domain.com购买了一个通配符SSL证书,并将所有子域从http重定向到https 到目前为止,这很容易,但现在我们有客户在他们的浏览器中手动键入www.customer1.domain.com,因为这不存在vhost 我现在要做的是,将所有请求从重定向到 我们的vhost看起来像: <VirtualHost {{IP-ADRR}
- customer1.domain.com
- customer2.domain.com
<VirtualHost {{IP-ADRR}}:443>
Servername %1.domain.com
VirtualDocumentRoot /path/to/webroot/%0
Include /etc/httpd/conf/options-ssl-standard.conf
</VirtualHost>
<Virtualhost {{IP-ADRR}}:80>
ServerName %1.domain.com
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
服务器名%1.domain.com
VirtualDocumentRoot/path/to/webroot/%0
包括/etc/httpd/conf/options-ssl-standard.conf
我们将所有HTTP请求重定向到HTTPS上的相同目标,如下所示:
<VirtualHost {{IP-ADRR}}:443>
Servername %1.domain.com
VirtualDocumentRoot /path/to/webroot/%0
Include /etc/httpd/conf/options-ssl-standard.conf
</VirtualHost>
<Virtualhost {{IP-ADRR}}:80>
ServerName %1.domain.com
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
服务器名%1.domain.com
重新启动发动机
重写cond%{HTTPS}=在…上
重写规则^(.*)$https://%{HTTP_HOST}$1[R=301,L]
重定向的解决方案是:
<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>
这两行是重定向条件,它们用于确定是否应该重定向请求。因为这些条件与[OR]连接,如果这两个条件中的任何一个返回true,Apache将执行重写规则(重定向)
第一个条件确定请求是否使用非HTTPS URL。第二个条件确定请求是否使用www URL。请注意,我使用了www\。而不是www,因为模式是一个正则表达式和。点在这里有一个特殊的含义,因此它必须被转义
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
第四行是我用来避免在URL中直接引用主机名的方便行。它匹配传入请求的主机,并将其分解为www部分(如果有)和主机名的其余部分。稍后我们将在重写规则中用%1引用它
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
重写规则是重定向的核心。通过这一行,我们告诉Apache将任何请求重定向到一个新URL,由以下内容组成:
- %1:对主机非www部分的引用
- %{REQUEST_URI}:请求的URI,不带主机名
- 不转义特殊字符
- R=301以使用HTTP 301重定向状态
- L停止处理其他规则,并立即重定向
RewriteCond%{HTTPS}off[或]
。端口80用于未加密的HTTP和键入https://www.example.com:80/
永远不会完成与服务器的HTTPS握手,因此重写无论如何都不会生效。