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 скрипта, которым можно проверить переменную:
Скрипт нужно разместить в корне сайта, потом обратиться к нему в браузере.
Также можно использовать скрипт phpinfo, в его выводе тоже будет переменная и значение в случае если они передаются.
Пример в выводе phpinfo:
Если заголовка нет исправить ситуацию можно скорректировав настройки 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, а также про структуру конфигурационных файлов сервиса.