nginx + docker: перенаправление с http на https - PullRequest
1 голос
/ 26 марта 2019

У меня есть nginx внутри контейнера докера, который я хочу заставить SSL на весь запрос. Поскольку мне нужно выставить порт веб-сервера в другом порту вне контейнера, я не использую стандартные порты при доступе к серверу.

Я сопоставил порт SSL 443 внутри своего контейнера с 8888 снаружи, поэтому, когда я пишу URL https://myserver:8888, HTTPS работает нормально.

Что происходит, когда я не использую префикс https? Порт 443 все еще прослушивает, но так как я не использую схему https, я получаю следующую ошибку:

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

Если я перенаправлю запрос на порт 80 на 443, этого будет недостаточно, поскольку из-за того, что я получаю доступ через порт 8888, все запросы поступают через порт 443, но я не могу гарантировать, что используется схема HTTP.

Я имею в виду, что следующий блок не действует, потому что я не выставляю порт 80 снаружи, только 8888, который отображается непосредственно на 443

server {
        server_name myserver;
        listen 80;
        return 301 https://$host:$server_port$request_uri;
}

Как я могу заставить его работать, даже если пользователь вводит http в URL?

Спасибо

1 Ответ

1 голос
/ 26 марта 2019

Вы должны использовать два разных порта: например, 8888 и 8889.

Привязать первый порт к 80 контейнера, а второй к 443.

Если клиент хочет связаться с вашим контейнером по http, он должен будет использовать 8888 (-> 80). Если vhost правильно настроен, nginx будет передавать код возврата HTTP 301 или 302 (перенаправление) на порт https (8889 -> 443).

Так что ваше возвращение может выглядеть как

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

И клиент запустит TLS-соединение на правом порту.


Из-за технических ограничений довольно сложно использовать один и тот же порт как для чистого трафика, так и для TLS-шифрованного, поэтому большинство веб-серверов будут прослушивать два разных порта: 80 для обычного текста и 443 для TLS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...