Как дать понять apache, что нужно работать с https, если фронт-эндом работает nginx?

Аватар пользователя admin

Довольно часто есть необходимость организовать работу через SSL, т.е. HTTPS, при совместном использовании nginx и apache. Однако, тут возникает сложность. Специфика HTTPS в том, что только nginx может устанавливать HTTPS соединение с клиентом, а далее он проксирует до apache обычный HTTP. В свою очередь, apache в обычном случае не знает, что клиент установил соединение с nginx по HTTPS а не по HTTP и как следствие, движок сайта, используемый в работе генерирует все абсолютные ссылки на странице касательно стилей и картинок как http://... а не https://.... В свою очередь это приводит к тому, что у клиента в браузере страница оказывает частично зашифрованной и если уровень безопасности установлен в нормальный (по умолчанию) и выше, то рядом со значком замка (HTTPS соединение) будет предупреждающий значок, а также на странице может не оказаться картинок и стилей. Таким образом, apache необходимо ЯВНО указать, что он должен работать с HTTPS а не HTTP, если nginx принял соединение по HTTPS, а не HTTP.

Вот простой способ как это сделать.

Первым делом, в nginx.conf мы должны установить специальный заголовок с помощью директивы:

proxy_set_header                    X-Forwarded-Proto $scheme;


которая размещается в основной части конфигурационного файла в глобальных настройках.

Далее, в конфигурационном файле для apache, который отвечает за конкретный виртуалхост необходимо добавить директиву:

SetEnvIf X-Forwarded-Proto "^https$" HTTPS=on


Вот собственно и всё. Не забудьте, перезапустить nginx и apache. Теперь в переменную $scheme в nginx попадёт "http" или "https" в зависимости от типа установленного клиентом соединения. И это значение будет передано в apache, установив переменную HTTPS в "on", если значение будет "https".

Что ещё занимательно, это то, что переменная HTTPS хотя и установлена, но доступ к ней, например модулем mod_rewrite не такой как к остальным переменным, установленным на сервере. Если, например, на переменную HTTP_HOST в правилах mod_rewrite нужно ссылаться как %{HTTP_HOST}, то в случае использования %{HTTPS}, правила mod_rewrite работать не будет, модуль mod_rewrite будет всегда считать переменную %{HTTPS} всегда пустой. Поэтому использовать надо не %{HTTPS}, а %{ENV:HTTPS} - в этом случае всё будет работать как ожидалсь.

0
Ваш рейтинг: Нет