Как дать понять apache, что нужно работать с https, если фронт-эндом работает nginx?
Довольно часто есть необходимость организовать работу через 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} - в этом случае всё будет работать как ожидалсь.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 2975 просмотров