Как правильно настроить редирект с HTTP на HTTPS в конфигурации Nginx для приложения на Nuxt 3?

Я выпустил сертификат, и в целом сайт работает нормально, доступен по https. Однако возникла проблема: при обращении по http сайт открывается без сертификата, и нет автоматического редиректа на https. 
Вот конфигурация nginx: 
<pre><code>server {
    listen 80;
    listen [::]:80;
    root /var/www/mydomain.ru/site_nuxt;
    index index.html;
    server_name mydomain.ru;

    gzip on;
    gzip_types text/plain application/xml text/css application/javascript;
    gzip_min_length 1000;
    error_page 497 301 =307 https://$host:$server_port$request_uri;
    location / {
      add_header Access-Control-Allow-Origin *;
      proxy_pass http://localhost:3000;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection 'upgrade';
      proxy_set_header Host $host;
      proxy_cache_bypass $http_upgrade;
      proxy_redirect off;
      proxy_ssl_certificate /etc/letsencrypt/live/mydomain.ru/fullchain.pem;
      proxy_ssl_certificate_key /etc/letsencrypt/live/mydomain.ru/privkey.pem;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Ssl on;
    }
    location ~ /\.ht {
        deny all;
    }
    
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mydomain.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mydomain.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = mydomain.ru) {
        return 301 https://$host$request_uri;
  • 17 сентября 2024 г. 9:23
Ответы на вопрос 1
Вы почти правильно настроили редирект с HTTP на HTTPS, однако конфигурация содержит некоторые недочёты и избыточные части, которые могут запутывать Nginx. 

Чтобы корректно реализовать редирект с HTTP на HTTPS в конфигурации для вашего приложения на Nuxt 3, вы можете сделать следующее:

1. Убедитесь, что вы используете один серверный блок для обработки HTTP запросов и редиректа на HTTPS.
2. Убедитесь, что ваш серверный блок для HTTPS правильно настроен.

Вот пример упрощенной конфигурации Nginx, которая должна решить вашу проблему:

```nginx
server {
    listen 80;
    listen [::]:80;
    server_name mydomain.ru www.mydomain.ru;

    # Редирект с HTTP на HTTPS
    return 301 https://$host$request_uri; 
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name mydomain.ru www.mydomain.ru;

    # SSL настройки
    ssl_certificate /etc/letsencrypt/live/mydomain.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mydomain.ru/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    root /var/www/mydomain.ru/site_nuxt;
    index index.html;

    gzip on;
    gzip_types text/plain application/xml text/css application/javascript;
    gzip_min_length 1000;

    location / {
        add_header Access-Control-Allow-Origin *;
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Ssl on;
    }

    location ~ /\.ht {
        deny all;
    }
}
```

### Объяснение:
1. **Первый `server` блок**: Этот блок прослушивает HTTP-запросы на порту 80 и выполняет полный редирект на HTTPS, возвращая статус 301.
2. **Второй `server` блок**: Этот блок обрабатывает HTTPS-запросы на порту 443, обеспечивая подключение Secure Sockets Layer (SSL).
3. Будьте уверены, что у вас есть строка `server_name`, которая включает все версии домена (www и без www), чтобы охватывать все возможные запросы на ваш сайт.

### Примечание:
- После внесения изменений, не забудьте протестировать конфигурацию с помощью команды `nginx -t`, а затем перезапустите Nginx: `sudo systemctl restart nginx` или `sudo service nginx restart`, чтобы изменения вступили в силу.
Похожие вопросы