Как перенаправить с http://www.* на https://* в Nginx?

Итак, я пытаюсь достичь 4 вещей:

  • поддержка как ip-v4, так и ip-v6
  • поддержка SSL-сертификатов letsencrypt (расположение acme-challenge в http)
  • перенаправить с www на без www
  • перенаправить http на https

Я придумал конфиг, но он, похоже, не работает. Я получаю сообщение "страница не существует" при попытке доступа к http://www.MY_DOMAIN.COM. Из-за настройки hsts это работает после однократного посещения версии https без www.

Обратите внимание, что у меня есть ssl-сертификаты как для домена www, так и для него.

Как я могу добиться этого/что я делаю неправильно в моей конфигурации:

# HTTP server
#
server {
    listen [::]:80;
    server_name MY_DOMAIN.COM www.MY_DOMAIN.COM;

    location /.well-known/acme-challenge {
        root /var/www/letsencrypt;
        try_files $uri $uri/ =404;
    }

    location / {
        return 301 https://MY_DOMAIN.COM$request_uri;
    }
}
# HTTPS server
#
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.MY_DOMAIN.COM;

    ssl on;
    ssl_certificate         /etc/letsencrypt/live/www.MY_DOMAIN.COM/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/www.MY_DOMAIN.COM/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/www.MY_DOMAIN.COM/fullchain.pem;

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 5m;
    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    add_header Strict-Transport-Security "max-age=86400; includeSubDomains";

    return 301 https://MY_DOMAIN.COM$request_uri;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server ipv6only=on;
    server_name MY_DOMAIN.COM;

    ssl on;
    ssl_certificate         /etc/letsencrypt/live/MY_DOMAIN.COM/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/MY_DOMAIN.COM/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/MY_DOMAIN.COM/fullchain.pem;

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 5m;
    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    add_header Strict-Transport-Security "max-age=86400; includeSubDomains";

    root /var/www/MY_DOMAIN.COM;
    index index.html;
}

Кроме того, мне не очень нравится принцип копирования и вставки двух серверных блоков.


person Patrick    schedule 11.08.2017    source источник
comment
Вам нужно добавить listen 80 в верхний блок server, чтобы IPv4 тоже прослушивал.   -  person Richard Smith    schedule 11.08.2017
comment
@ Ричард Смит, ты прав. После изменения это работает, как и ожидалось... это была ошибка дампа. Однако сейчас нет ответа, чтобы принять...   -  person Patrick    schedule 11.08.2017


Ответы (1)


Как отмечает @RichardSmith; Я не слушал версию ipv4 варианта http://www. Таким образом, редикт вообще не был запущен.

После исправления установка работает.

person Patrick    schedule 11.08.2017