Почему сайт не перенаправляет с HTTP на HTTPS?

Здравствуйте! Я хотел бы уточнить, правильно ли я настроил свой сайт. У меня был сайт на HTTP, и я купил домен, а также зарегистрировал сертификат в Let's Encrypt. Затем я настроил перенаправление с HTTP на HTTPS. В браузере всё выглядит корректно, но в логах отображается, что используется HTTP 1.0. 

Вот конфигурация nginx (домен заменён на example):

```
server {
    server_name example.ru www.example.ru;

    location / {
        proxy_pass https://127.0.0.1:9123;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        if ($scheme = http) {
            return 301 https://$host$request_uri;
        }
    }

    location /ws/ {
        proxy_pass https://127.0.0.1:9123;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        if ($scheme = http) {
            return 301 https://$host$request_uri;
        }
    }

    error_log /var/log/nginx/example_error.log;
    access_log /var/log/nginx/example_access.log;

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.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 = www.example.ru) {
        return 301 https://$host$req
```
Правильно ли я всё настроил?
  • 21 января 2025 г. 12:44
Ответы на вопрос 2
Судя по вашей конфигурации, вы указали правильные параметры для обработки HTTPS и проксирования запросов. Однако некоторые моменты могут вызвать проблемы с перенаправлением с HTTP на HTTPS и с тем, что в логах отображается использование HTTP 1.0. Давайте разберёмся с вашими конфигурациями.

1. **Отсутствие конфигурации для HTTP**: Вам необходимо настроить отдельный серверный блок для обработки HTTP-трафика и перенаправления его на HTTPS. Ваш код выше содержит только конфигурацию для HTTPS (порт 443) и не содержит конфигурации для HTTP (порт 80).

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

   ```nginx
   server {
       listen 80;
       server_name example.ru www.example.ru;

       return 301 https://$host$request_uri;
   }
   ```

2. **Проблема с `if`**: Ваша конструкция с использованием `if` для проверки схемы (`$scheme`) не является лучшей практикой. Если вы добавите отдельный серверный блок для HTTP, то перенаправление может быть выполнено более чисто без использования условных операторов.

3. **Логи с HTTP 1.0**: Так как у вас не было указано конфигурации для порта 80, возможно, ваши клиенты по-прежнему обращаются к вашему серверу по HTTP, и их запросы не перенаправляются. Если у вас есть клиентский код или какое-то приложение, которое обращается к вашему сайту по HTTP, оно может указывать протокол, который не поддерживает HTTP/2 или более новые версии.

Таким образом, попробуйте добавить вышеуказанный серверный блок для HTTP и удалите `if` в текущем конфигурационном блоке. Полная конфигурация может выглядеть так:

```nginx
server {
    listen 80;
    server_name example.ru www.example.ru;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl; # managed by Certbot
    server_name example.ru www.example.ru;

    ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.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

    location / {
        proxy_pass https://127.0.0.1:9123;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /ws/ {
        proxy_pass https://127.0.0.1:9123;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    error_log /var/log/nginx/example_error.log;
    access_log /var/log/nginx/example_access.log;
}
```

После внесения изменений не забудьте перезагрузить Nginx, чтобы применить новую конфигурацию:

```bash
sudo systemctl reload nginx
```

Убедитесь, что теперь все запросы по HTTP будут перенаправляться на HTTPS.
server {
        listen      example.com.ru:80;
        server_name example.com.ru;
        rewrite ^(.*)$ https://$server_name$1 permanent;
    }
    server {
         listen      example.com.ru:443 ssl;
         server_name example.com.ru;
	ssl_certificate ...
Похожие вопросы