我已经对此进行了彻底的搜索,但还没有明确的答案。
例如,假设我有一个域example.com
,我希望它是我的规范URL(即www.example.com
应该301重定向到example.com
。
这就是我所做的:
- DNS
- 将
example.com
的A
记录添加到server IP
- 为
www.example.com
添加了一条CNAME
记录作为example.com
的别名
- 将
- Web服务器方面(如果重要的话,我使用了nginx(
- 将Upstream设置为
server IP
- 将所有
http
重定向到https
- 使用301请求配置重定向特定的
www.example.com
,如下所示:return 301 $scheme://example.com;
- 将Upstream设置为
然后我用这样的重定向检查器进行了测试,得到了这样的结果:
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.com
和www.example.com
。
所以这是因为我在论坛上看到一些参考资料说:
使用DNS的另一个原因是避免获得两个域的https。
我错过了什么?
编辑:
如果这很重要,我将使用docker映像nginx-proxy
来自动创建一个虚拟主机。证书被签名为example.com
,并且我将example.com
和www.example.com
配置都创建为虚拟主机。
根据Richard Smith的评论,是的,我只需要对www.example.com
和example.com
使用SAN证书。我不知道这是一件事。
使用SAN证书,我只能为这两种类型的域创建一个证书。