Nginx:通过 https 重定向到 www

Nginx:通过 https 重定向到 www

我正在尝试重定向https://domain.ltdhttps://www.domain.ltdNginx(请注意 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
}

相关内容