【发布时间】:2020-08-02 00:03:46
【问题描述】:
我已经对此进行了彻底的搜索,但还没有明确的答案。
例如,假设我有一个域 example.com,我希望这是我的规范 URL(即 www.example.com 应该 301 重定向到 example.com。
这就是我所做的:
- DNS 方面
- 将
example.com的A记录添加到server IP - 为
www.example.com添加了一条CNAME记录作为example.com的别名
- 将
- webserver-wise(如果重要的话,我使用了 nginx)
- 已将上游设置为
server IP - 将所有
http重定向到https - 使用 301 请求配置重定向特定的
www.example.com,如下所示:return 301 $scheme://example.com;
- 已将上游设置为
然后我用this之类的重定向检查器进行了测试,得到了这个结果:
-
http://example.com--> 301 重定向到https://example.com -
http://www.example.com--> 301 重定向到https://www.example.com -
https://example.com--> 200 OK,正在正常提供内容` -
https://www.example.com--> 301 重定向到https://example.com
这听起来像是我一直想要实现的,在我的 Chrome 浏览器上打开所有这 4 个链接确实有效。所有这些链接都正确重定向到https://example.com,并且所有证书都有效。
但是,如果我尝试检查我的站点,例如 woorank.com 或尝试使用 Python3 的 request 模块提出请求,他们会告诉我 www.example.com 的证书无效。
>>> import requests
>>> r = requests.get("https://www.example.com")
>>> r
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.example.id', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError("hostname 'www.example.com' doesn't match 'example.com'")))
这是因为我确实只有一个证书,在域 example.com 上注册,并且确实将它用于虚拟主机 example.com 和 www.example.com。
所以这是因为我在forum 上看到了一些参考资料:
使用 DNS 的另一个原因是避免两个域都获得 https。
我错过了什么?
编辑:
如果这很重要,我将使用 docker 映像 nginx-proxy 自动创建虚拟主机。证书签名为example.com,我将example.com 和www.example.com 配置都创建为虚拟主机。
【问题讨论】:
-
您需要一个对
www.example.com有效的证书。您可以为两个域获取一个证书,或使用单独的证书。 -
@RichardSmith 谢谢!我们真的需要不同的证书才能进行 301 重定向吗?
-
重定向通过
https连接传递。浏览器必须首先协商到服务器的连接。服务器可以使用任何证书,但如果服务器使用对域无效的证书,大多数浏览器都会警告用户。 -
但这并没有 100% 在我的脑海中点击,因为像 redirect-checker.org/index.php 这样的网站能够获得 301 重定向。在那里测试了我的域,它正确显示了 301。这是否意味着该网站没有使用
https进行测试?