我正在尝试重定向https://domain.ltd
到https://www.domain.ltd
Nginx(请注意 www),这里是配置:
server {
listen 80;
server_name domain.ltd;
return 301 https://www.$host$request_uri;
}
server {
listen 443;
server_name domain.ltd;
return 301 https://www.$host$request_uri;
}
server {
listen 443 ssl;
server_name www.domain.ltd domain.ltd;
...main config goes here
}
我觉得奇怪的是,所有其他选项都可以正常工作:
http://domain.ltd
重定向至https://www.domain.ltd
http://www.domain.ltd
重定向至https://www.domain.ltd
https://www.domain.ltd
也有效
但是没办法https://domain.ltd
,它只显示ERR_CONNECTION_REFUSED
。
配置有什么问题?我该如何解决?
UPD。我的 SSL 证书中包含 www.domain.ltd 和 domain.ltd,所以没有理由不工作
答案1
您必须打开 ssl。
SSL 是一种协议,HTTP 是另一种协议。在服务器端,端口号不会隐式指定协议。您可以在任何端口运行其中任何一种。另一方面,浏览器会隐式尝试使用端口 80 上的 http 和 443 上的 https (ssl) 进行通信。
当然,如果双方语言不同,就会出现沟通错误。
无论您只是想重定向某些内容、打开 websocket 还是获取网页,您都必须遵守浏览器的期望或明确指定您想要的内容。
您可以http://some.site.com:443/
强制客户端(浏览器)使用非隐式协议(443 上没有“s”的 http),这很可能与您当前的配置兼容。但这里正确的做法是不要让您的用户感到困惑,并且每次使用端口 443 时都包含 ssl(以及所有附加功能)。
答案2
你犯了很多错误
- 未监听 SSL
- 未指定 SSL 密钥和证书
- 在两个服务器块中指定一个域
- 缺少斜线
如果你不了解 SSL,请阅读我的Nginx/SSL 教程,它将帮助您获得免费的 Let's Encrypt SSL 证书。
以下是一个可供尝试的配置
server {
listen 80;
server_name domain.ltd;
return 301 https://www.domain.ltd/$request_uri;
}
server {
listen 443 ssl;
server_name domain.ltd;
ssl_certificate ....; # Insert certificate references
ssl_certificate_key ...; # Insert certificate key references
return 301 https://www.domain.ltd/$request_uri;
}
server {
listen 443 ssl;
server_name www.domain.ltd;
ssl_certificate ....; # Insert certificate references
ssl_certificate_key ...; # Insert certificate key references
...main config goes here
}