301重定向www到非www站点的最佳实践



我已经对此进行了彻底的搜索,但还没有明确的答案。

例如,假设我有一个域example.com,我希望它是我的规范URL(即www.example.com应该301重定向到example.com

这就是我所做的:

  • DNS
    • example.comA记录添加到server IP
    • www.example.com添加了一条CNAME记录作为example.com的别名
  • Web服务器方面(如果重要的话,我使用了nginx(
    • 将Upstream设置为server IP
    • 将所有http重定向到https
    • 使用301请求配置重定向特定的www.example.com,如下所示:return 301 $scheme://example.com;

然后我用这样的重定向检查器进行了测试,得到了这样的结果:

  • http://example.com->301重定向到https://example.com
  • http://www.example.com->301重定向到https://www.example.com
  • CCD_ 19->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.comwww.example.com

所以这是因为我在论坛上看到一些参考资料说:

使用DNS的另一个原因是避免获得两个域的https。

我错过了什么?

编辑:

如果这很重要,我将使用docker映像nginx-proxy来自动创建一个虚拟主机。证书被签名为example.com,并且我将example.comwww.example.com配置都创建为虚拟主机。

根据Richard Smith的评论,是的,我只需要对www.example.comexample.com使用SAN证书。我不知道这是一件事。

使用SAN证书,我只能为这两种类型的域创建一个证书。

最新更新