Nginx:将 HTTPS 站点重定向到 www HTTPS,需要证书吗?

Nginx:将 HTTPS 站点重定向到 www HTTPS,需要证书吗?

我有一个证书example.comwww.example.com以下配置:

server {
    listen              443 ssl;
    listen              [::]:443 ssl;
    server_name         example.com;
    return              301 https://www.example.com$request_uri;
}

我尝试重定向到www.example.com,当我访问 时,它可以正常工作https://example.com。我成功重定向。但我不明白它为什么会起作用。301 重定向应该通过 SSL 进行,但我没有指定证书。它怎么会起作用?

另外,推荐的方法是什么?只是在上面的块中添加证书吗?

答案1

是的,您需要一个证书才能将 https:// 网站重定向到https://www网站。通常,最简单的方法是获取一个涵盖 www 和非 www 的证书,并在两个服务器配置中使用它。Let's Encrypt 可以毫无问题地做到这一点。

你的配置为什么有效?

我不知道为什么上面的配置在没有指定证书的情况下也能工作。据我所知它不应该工作。

我将您的配置放入 AWS 上的 Nginx 实例中,稍作调整如下

server {
  listen              443 ssl;
  listen              [::]:443 ssl;
  server_name         example2.com;
  return              301 https://www.example2.com$request_uri;
}

server {
  listen              443 ssl;
  listen              [::]:443 ssl;
  server_name         www.example2.com;

  root /var/www/folder;
}

我在 /etc/hosts 中添加了以下内容

11.0.1.10 example2.com www.example2.com

当我执行 wget 时,我得到了以下结果

wget https://www.example2.com
--2017-07-29 08:07:17--  https://www.example2.com/
Resolving www.example2.com (www.example2.com)... 11.0.1.10
Connecting to www.example2.com (www.example2.com)|11.0.1.10|:443...     connected.
Unable to establish SSL connection.

您可以看到它可以连接到服务器,但无法建立 SSL 连接。当我使用 curl 时,我得到了不同的响应,但它不起作用。

curl https://www.example2.com
curl: (35) Encountered end of file

基于此,我认为您告诉我们的内容缺少了一些内容。

应该是这样的

这显示了如何配置 Nginx。

# Main website, https www
server {
  server_name www.example.com;
  listen 443 ssl http2; # http2 is optional
  ssl_certificate /path/to/fullchain;
  ssl_certificate_key /path/to/privkey;

  # locations etc
}

# forward https non-www to www
server {
  server_name example.com;
  listen 443 ssl;
  ssl_certificate /path/to/fullchain;
  ssl_certificate_key /path/to/privkey;

  return 301 https://www.example.com$request_uri;
}    

# Forward http to https
server {
    listen       80;
    server_name  example.com www.example.com;
    access_log  /var/log/nginx/access.log main buffer=128k flush=1m if=$log_ua;
    return       301 https://example.com$request_uri;
}

相关内容