Apache Redirect Wildcard子子域到子域

时间:2017-09-01 13:40:39

标签: apache ssl url-rewriting hosting wildcard-subdomain

我目前正在开发一个可以使用通配符子域构建的应用程序。

例如:

  • 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>

1 个答案:

答案 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,由以下内容组成:

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

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

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