Назад | Перейти на главную страницу

Nginx: перенаправить сайт HTTPS на www HTTPS, нужен сертификат?

У меня есть сертификат на example.com и www.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, но я не указывал сертификат. Как это могло работать?

Кроме того, какой способ рекомендуется сделать? Просто добавить сертификат в блок выше?

Да, вам нужен сертификат для сайта https: // для перенаправления на https: // www сайт. В общем, самый простой способ - получить сертификат, охватывающий как www, так и не www, и использовать его в обеих конфигурациях сервера. Let's Encrypt делает это без проблем.

Почему ваша конфигурация работает?

Я понятия не имею, почему ваша конфигурация выше работает без указанного сертификата. Насколько я знаю, не должно.

Я поместил вашу конфигурацию в свой экземпляр Nginx на AWS, слегка изменив его следующим образом

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;
}