Принудительно https для всех блоков сервера в контексте https - PullRequest
0 голосов
/ 16 мая 2018

Я пробую nginx впервые и делаю это с помощью Docker. В основном я хочу добиться следующей архитектуры

Я генерирую файл /etc/nginx/conf.d/default.conf с некоторыми переменными окружения при запуске. Этот файл затем включается в контекст http файла default.conf, что накладывает некоторые ограничения на то, что я могу настроить. ( связанная проблема )

Вы можете увидеть мой текущий nginx.conf файл здесь (файл достаточно большой для встраивания здесь).

И вы можете увидеть файл docker-compose.yml здесь .

Проблема:

400 Неверный запрос Простой HTTP-запрос был отправлен на порт HTTPS

На самом деле я не могу сделать так, чтобы любой вызов http://(app/api).example.com был перенаправлен на его https версию, я пытался с этим безуспешно: (см. Вышеупомянутый связанный файл)

server {
    listen 80 ssl;
    listen 443 ssl;
    listen [::]:80 ssl;
    listen [::]:443 ssl;
    server_name  api.dev.local;

    if ($http_x_forwarded_proto = "http") {
      return 301 https://$server_name$request_uri;
    }

    # more code...
}

Любые рекомендации, касающиеся моих реальных конфигов, приветствуются в разделах комментариев! Я только начинаю использовать nginx и таким образом читаю тонн artciles , которые предоставляют фрагменты кода, которые я просто копирую и вставляю после прочтения того, для чего они нужны.

1 Ответ

0 голосов
/ 16 мая 2018

Протокол https является расширением http, поэтому они в некоторой степени являются различными протоколами.В настоящий момент ваш сервер не ожидает http on: 80, он скорее ожидает https из-за настройки listen 80 ssl.Это приводит к ошибке.

Вам необходимо отделить обработку http запросов на: 80, которая должна быть перенаправлена ​​на https на: 443, от обработки https на: 443, которая должна быть обработанаобычно.

Это можно сделать, разделив другой server конфигурационный блок для http on: 80:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

... и удалив прослушивание: 80 из текущегоблок:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    # more code...
}

Следующая статья блога дает более подробную информацию, если необходимо https://bjornjohansen.no/redirect-to-https-with-nginx

...