Меню Закрыть

Nginx переадресация на https

Как и большая часть сайтов интернета, которые следуют современным тенденциям losst.ru использует безопасный протокол связи https. Многим сайтам при переходе на https необходимо, чтобы весь трафик, который приходит на порт http автоматически перенаправлялся на https.

Это необходимо из соображений SEO оптимизации, а также безопасности пользователей, чтобы никто не мог разорвать защищенное соединение. В этой статье мы рассмотрим как настроить редирект с http на https Nginx.

Редирект с http на https Nginx

Я предполагаю, что вы будете использовать постоянное перенаправление с кодом статуса 301. Это означает перемещение на постоянной основе. Такой метод используется чтобы сообщить поисковым системам или браузеру, что текущая ссылка была обновлена, и ее стоит обновить в своей базе, например, закладок браузера.

В конфигурационном файле Nginx должно быть две секции server, для сайта на https и сайта http. В секции http вы просто перенаправляете все запросы на https c помощью инструкции return, а во второй секции уже все обрабатываете. Например, первая секция:

server <
server_name losst.ru www.losst.ru;
charset off;
index index.php;
ssi on;
return 301 https://$host:443$request_uri;
set $root_path /var/www/losst/data/www/losst.ru;
root $root_path;
listen :80 default_server;
.
>

Вторая секция уже с обработкой SSL слушает запросы на 443 порту:

server <
server_name losst.ru www.losst.ru;
ssl on;
ssl_certificate "/var/www/losst/losst.ru_le2.crtca";
ssl_certificate_key "/var/www/losst/losst.ru_le2.key";
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security "max-age=31536000;";
charset off;
index index.php;
set $root_path /var/www/losst/data/www/losst.ru;
root $root_path;
listen :443 default_server;
.
>

Собственно, синтаксис тут очень прост, инструкция return позволяет возвращать необходимые коды ответа сервера. Здесь же мы возвращаем код 301, постоянный редирект, а также URL, на который собираемся перенаправить пользователя. Кроме директивы return, можно использовать инструкцию rewrite, с помощью нее выполняются точно те же действия:

rewrite ^/(.*)$ https://losst.com/$1 permanent;

Читайте также:  Администратор заблокировал принтер windows 10

Это обычный синтаксис регулярных выражений. В первом аргументе мы выделяем группу строки запроса, а во второй указываем правильный домен. Ее можно добавить вместо return 301. Также можно использовать такую конструкцию без отдельного блока server:

* ^(losst.ru|www.losst.ru)$ ) <
rewrite ^/(.*)$ https://losst.ru/$1 permanent;
>

Теперь осталось протестировать то, что получилось. Сохраните файл и проверьте конфигурацию nginx:

Затем, если все хорошо, перезапустите Nginx:

sudo systemctl restart nginx

Далее можно проверить какой ответ сервера вы получите с помощью curl:

Или позволим утилите проследовать полный путь по перенаправлению:

curl ILa losst.ru

Выводы

Настроить редирект на https nginx достаточно просто, фактически, все выполняется добавлением одной строки в конфигурационный файл, все остальное — дополнительные параметры. Редирект с https на http nginx будет выполняться так же. Только нужно будет изменить несколько букв в параметрах retrun. Не забывайте проверять правильно ли настроены редиректы с www и на https, это играет очень важную роль для SEO. Надеюсь, эта информация была полезной для вас.

Published by Roman Matovsky on June 9, 2017 June 9, 2017

Корпорация Google уже неоднократно заявляла о том, что будет выше ранжировать сайты, которые работают через защищеное соединение. А начиная с этого года ещё и Firefox всячески пытается предупредить своих пользователей о том, что их данные могут оказаться в опасности если попытаться ввести логин и пароль на сайте без SSL шифрования.

Таким образом, если у вас есть форум или система комментирования, но сайт работает через не защищенное соединение, то пользователи у которых Firefox будут видеть то, что я показал на скриншоте выше. А это отпугивает посетителей. Поэтому сегодня будем решать эту проблему.

Читайте также:  Лучшие приложения для планшета андроид

Ранее я уже писал статью о том как заставить работать в связке Apache2 и Nginx, где первый выступает в роли бэкэнда, а второй в роли фронтэнда. И если ваш сайт работает именно в такой связке, то я расскажу в сжатой и доступной форме как защитить передаваемый трафик между сервером и клиентом, используя механизм SSL шифрования.

Для начала вам потребуется сам сертификат безопасности. Без него никак не получится перевести сайт на защищенное соединение. Если он у вас уже есть, то далее всё очень просто.

Не забудьте скачать моё приложение на iPhone

И так, открываем конфигурационный файл Nginx, а именно nginx.conf . Для начала сразу добавим конфигурацию для редирект с http на http s . Для этого перед секцией server своего сайта добавляем:

server_name intaiwan.ru www.intaiwan.ru;

rewrite ^(.*) https://$host$1 permanent;

На этом всё. Редирект с http на http s мы настроили. Теперь переходим ниже, в саму секцию server нашего сайта. Там нам необходимо заменить строчку

listen 11.22.33.44:443 ssl;

а ниже добавляем строки:

Таким образом, настройка редиректа с http на http s и защищённого соединения у нас должен выглядеть примерно так:

server_name intaiwan.ru www.intaiwan.ru;

rewrite ^(.*) https://$host$1 permanent;

listen 11.22.33.44:443 ssl;

server_name intaiwan.ru www.intaiwan.ru;

error_page 404 = @fallback;

А теперь нам необходимо внести небольшую запись в настройки Apache в секцию VirtualHost нашего сайта:

SetEnvIf X-Forwarded-Proto https HTTPS=on

Однако необходимо учитывать один важный момент. Вам необходимо будет переписать пути до картинок, стилей и скриптов с http на http s . Иначе страницы будут отображаться с ошибками.

Хочу использовать только https и хочу сделать редирект с http на https

The plain HTTP request was sent to HTTPS port

Читайте также:  Установка принтера самсунг scx 3200

https работает нормально

enginx использую в качестве фронт-енда, апач в качестве бекенда.

Хочу чтобы все соединения до nginx шли в зашифрованном виде, а между nginx apache уже обычный http.

Что я делаю не так? Может есть какой-либо другой способ решить поставленную задачу?

  • Вопрос задан более трёх лет назад
  • 90133 просмотра

Не помогло, все-равно

400 Bad Request The plain HTTP request was sent to HTTPS port

Это говорит о том, что вы обращаетесь к HTTPS порту по HTTP протоколу. Проверьте кеш браузера, если ДО ваших экспериментов был редирект 301 кодом с неверным протоколом, то браузер запомнил(закешировал) навсегда и переходит без обращения к веб серверу, как вариант откройте приватную сессию браузера и проверьте — все будет работать верно.
302 код редиректит без кеширования — т.е. каждый раз. https://ru.wikipedia.org/wiki/%D1%EF%E8%F1%EE%EA_%.

В приведенном мной коде, лучше испльзовать 302 код для редиректа, если вы не хотите подобной проблемы.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.