nginx: редирект с http на https по нестандартному порту

26 September 2017 #nginx#tips

Есть два основных протокола передачи данных для гипертекста:

  1. Plain text
  2. SSL

Оба протокола используют свои собственные порты, для http используется 80-й порт и для https используется 443. При настройке https протокола для сайта обычно сразу же настраивают редирект с 80 порта на 443, дабы избежать дублей материалов в поисковых системах и для того, чтобы усилить безопасность передачи данных.

Обычно для этого используется следующая конструкция в конфигурации nginx:

server {
    listen 80;
    listen [::]:80;
    server_name  juev.ru www.juev.ru juev.org www.juev.org;
    return 301 https://www.juev.org$request_uri;
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name www.juev.org;
    ...
}

Создаются две секции конфигурации, одна для 80-го порта, другая для 443. И в первой секции указывают явный редирект на 443-порт, с помощью строки:

return 301 https://www.juev.org$request_uri;

Домен при этом часто заменяют на переменную $host.

При этом на стороне сервера так же настраивают передачу заголовков, которые явно указывают на использование SSL, что принуждает браузер использовать 443 порт. Но что делать, если необходимо настроить SSL на каком-нибудь нестандартном порту? Причин для этого может быть множество. И как оказалось, для данного варианта так же предусмотрено решение.

При использовании нестандартного порта будет использоваться только одна секция в конфигурации. При этом в нее добавляется одна строка, явно указывающая, что в случае использования Plain text необходимо переключиться на https-протокол:

error_page 497  https://$host:$server_port$request_uri;

Этого вполне достаточно для того, чтобы решить возникшую проблему. И заставить пользователя переключиться на https протокол при работе с сервером.