当通过301从HTTPredirect到Apache中的HTTPS来规范化域时,是否所有域都必须位于SSL证书上?

我有几个域指向同一台服务器。 只有其中一个域名(主要域名)实际上位于我的SSL证书上。 我在httpd.conf文件中包含了以下内容,所以它们都会永久redirect到一个域。

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] RewriteRule ^(.*)$ https://www.example.com$1 [R=301,L] 

意图是所有域名必须redirect到www.example.com作为HTTPS。 不过,我最近注意到这些redirect正在发生 – 但作为一个302redirect。 我在这里尝试了一个理智的检查,似乎按照我预期的那样工作。

所以回顾一下:

会发生什么情况: http : //sub1.example.com会导致302redirect到https://www.example.com 。

应该发生什么: http : //sub1.example.com会导致301redirect到https://www.example.com 。

我的问题是,所有的域名都必须在SSL证书上列出才能使301redirect发生? 我只是在这里拖着稻草。

只是为了完整性,这是发生这种情况时,初始页面和目标页面的请求/响应标头。

初始页面(sub1.example.com)的请求标题:

 GET / HTTP/1.1 Host: sub1.example.com Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 Upgrade-Insecure-Requests: 1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8 

初始页面(sub1.example.com)的响应标题:

 HTTP/1.1 302 Found Date: Wed, 04 Oct 2017 21:05:16 GMT Server: Apache Location: https://www.example.com/ Cache-Control: max-age=1 Expires: Wed, 04 Oct 2017 21:05:18 GMT Content-Length: 212 Keep-Alive: timeout=5, max=150 Connection: Keep-Alive Content-Type: text/html; charset=UTF-8 

目标网页(www.example.com)的请求标题:

 GET / HTTP/1.1 Host: www.example.com Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 Upgrade-Insecure-Requests: 1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.8 Cookie: <redacted> 

目标网页的响应标题(www.example.com):

 HTTP/1.1 200 OK Date: Wed, 04 Oct 2017 21:05:16 GMT Server: Apache Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Vary: Accept-Encoding Content-Encoding: gzip Keep-Alive: timeout=5, max=150 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 

如果你看到一个302redirect,那么看起来“别的东西”最终会触发redirect。 你发布的代码,如果它被执行,显然是301。

是否必须在SSL证书上列出所有的域名才能使这种redirect成为301?

不,如果你只是 HTTPredirect – 就像你的例子似乎显示。

如果您的其他域没有列在SSL证书上,那么您显然会尝试从https://otherdomain.com/...redirect,因为请求将永远不会到达您的服务器(除非用户接受无效的证书) 。