X-Forwarded-Proto в Nginx


X-Forwarded-Proto — HTTP заголовок, который показывает протокол, использованный клиентом при при запросе. Значения заголовка: HTTP и HTTPS




Заголовок не важен когда подключение происходит непосредственно к серверу, который отдаёт контент клиенту.

В ситуациях когда производится проксирование (при использовании балансировщиков и просто конфигураций с несколькими веб-серверами на одной машине) этот заголовок — единственное что определяет как именно сделан запрос.

Логи доступа веб-сервера будут содержать протокол использованный при запросе с прокси к серверу, обрабатывающему запросы, протокол в запросе клиента можно установить по заголовку X-Forwarded-Proto



Пример синтаксиса:

X-Forwarded-Proto: https



Заголовок важно проверять на уровне сервера при настройке работы сайта по https и диагностике в случаях когда сайт корректно не работает по https. Например, в случаях когда при запросе по https сбивается верстка.


Рассмотрим как добавить заголовок при использовании на одном сервере связки Nginx + Apache. Это самая популярная конфигурация для серверов обслуживающих сайты на PHP.



X-Forwarded-Proto и включение переменной в Nginx


Заголовок должен быть добавлен когда на машине используется связка Nignx + Apache и в случаях когда Nginx используется как балансировщик и находится на отдельной машине.



Как проверить наличие заголовка X-Forwarded-Proto и передаваемое значение



Пример PHP скрипта, которым можно проверить переменную:

X-Forwarded-Proto


Скрипт нужно разместить в корне сайта, потом обратиться к нему в браузере.



Также можно использовать скрипт phpinfo, в его выводе тоже будет переменная и значение в случае если они передаются.


Пример в выводе phpinfo:

X-Forwarded-Proto



Если заголовка нет исправить ситуацию можно скорректировав настройки Nginx

Для этого в конфигурационный файл виртуального хоста Nginx требуется добавить такую директиву:


mcedit /etc/nginx/sites-enabled/SITENAME.conf

proxy_set_header X-Forwarded-Proto $scheme;


Затем перечитать конфигурацию веб-сервер

nginx -s reload

Часто все настройки хэдеров проксирования proxy_set_header выносятся в отдельный файл, который подключается в виртуальном хосте, но это не обязательно.



X-Forwarded-Proto на стороне бэкенда


Этот этап можно пропустить, но тогда в каком-либо скрипте сайта потребуется дополнительно указывать переменную

$_SERVER['HTTPS'] = 'on';


Это можно делать в файле, в котором задаются реквизиты подключения к базе данных.



В Apache нужно подключить модуль setenvif

Это делается также в виртуальном хосте для сайта. Обычно файлы размещаются в директории /etc/apache/sites-enabled


mcedit /etc/apache/sites-enabled/SITENAME

LoadModule setenvif_module modules/mod_setenvif.so

SetEnvIf X-Forwarded-Proto https HTTPS=on



Чтобы изменения вступили в силу также нужно перечитать конфигурацию сервиса


service apache2 reload



Теперь переменная будет передаваться и её можно использовать.



Описанные настройки часто помогают справиться с проблемой незащищенного соединения для части элементов на странице.

Подобные предупреждения могут выдаваться браузером после подключения SSL сертификата.



Читайте про подключение SSL для Nginx, а также про структуру конфигурационных файлов сервиса.

Сказать спасибо