我有几个域都指向同一个服务器。这些域中只有一个域(主要域)实际上在我的 SSL 证书上。我在httpd.conf
文件中包含以下内容已有一段时间了,因此它们都永久重定向到单个域。
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com$1 [R=301,L]
目的是所有域都必须 301 重定向到www.example.com
HTTPS。但是,我最近注意到这些重定向正在发生 - 但作为 302 重定向。我在这里尝试了健全性检查,它似乎按我预期的那样工作。
回顾一下:
会发生什么:http://sub1.example.com
导致 302 重定向到https://www.example.com
.
应该发生什么:http://sub1.example.com
导致 301 重定向到https://www.example.com
.
我的问题是,是否必须在 SSL 证书上列出所有域才能使这种重定向以 301 的形式发生?我只是在这里拉稻草。
为了完整起见,这里是发生这种情况时初始页面和目标页面的请求/响应标头。
初始页面的请求标头 ( 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
如果您看到 302 重定向,那么似乎“其他东西”最终会触发该重定向。您发布的代码,如果执行,显然是 301。
不,只要您只是从HTTP 重定向 - 正如您的示例所示。
如果您的其他域未列在 SSL 证书上,那么您显然会在尝试从 重定向时遇到问题
https://otherdomain.com/...
,因为请求永远不会到达您的服务器(除非用户接受了无效证书)。