Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache将通配符子域重定向到子域_Apache_Ssl_Url Rewriting_Hosting_Wildcard Subdomain - Fatal编程技术网

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

因此,我们为*.domain.com购买了一个通配符SSL证书,并将所有子域从http重定向到https

到目前为止,这很容易,但现在我们有客户在他们的浏览器中手动键入www.customer1.domain.com,因为这不存在vhost

我现在要做的是,将所有请求从重定向到

我们的vhost看起来像:

<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,不带主机名
所有这些标记都连接在一起,并表示最终的重定向URI。最后,我们附加3个标志:

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

如果用户转到https://www.wildcard.domain.com? 下面的解决方案有效吗?对于端口80上的vhost侦听,您不需要
RewriteCond%{HTTPS}off[或]
。端口80用于未加密的HTTP和键入
https://www.example.com:80/
永远不会完成与服务器的HTTPS握手,因此重写无论如何都不会生效。