Я запускаю веб-сервер с несколькими пользователями. Машина предоставляет виртуальные хосты на основе Apache группе пользователей, которые могут обслуживать статический контент или использовать PHP. Никаких других форм серверных сценариев нет.
Вот как обрабатывается типичный запрос:
SSL-трафик HTTPS удаляется с помощью Pound, который действует как обратный прокси-сервер и перенаправляет запрос на Varnish, который также действует как обратный прокси-сервер, наконец, перенаправляя запрос на Apache.
К тому времени, когда трафик HTTPS достигает Apache, протокол, порт и полный URL-адрес изменились, скажем, с https://example.com:443/
к http://example.com:8443/
. Это результат всех прокси до Apache.
Есть ли способ обмануть сценарии PHP, заставив их думать, что запрос поступил с исходного URL-адреса, порта и протокола, без изменения кода PHP?
Это важно, потому что пользователи захотят запускать Joomla, WordPress и другие CMS на основе PHP, которые обнаруживают URL-адрес и вызывают проблемы с перенаправлениями, ссылками и т. Д.
Я, наверное, мог бы исправить mod_php
и построить его из исходного кода с необходимыми изменениями для моего конкретного сценария, но есть ли лучший способ предоставить скриптам PHP поддельные переменные среды, возможно, с помощью некоторых настроек в php.ini?
Самый простой способ сделать это - отбросить mod_php
и вместо этого использовать сценарий CGI. Это позволяет вам позвонить php-cgi
(версия интерпретатора PHP, ориентированная на CGI) из сценария оболочки, который выполняется при загрузке страницы.
Вот пример сценария bash, который устанавливает SERVER_PORT
и HTTPS
переменные среды на основе X-Forwarded-Proto
заголовок, а затем вызывает php-cgi
:
#!/bin/bash
# HTTPS fix (WARNING: THIS HEADER CAN BE FAKED BY THE CLIENT)
if [[ "$HTTP_X_FORWARDED_PROTO" == "https" ]]; then
export SERVER_PORT=443
export HTTPS="on"
else
export SERVER_PORT=80
fi
php-cgi
Конечно, вы должны быть осторожны, потому что заголовок X-Forwarded-Proto может быть отправлен клиентом, поэтому, если у вас нет чего-то, что находится между Apache и клиентом, очищающим этот заголовок, вы не должны ему доверять! (вы, вероятно, также захотите отключить брандмауэр от Apache, или еще лучше, пусть он будет прослушивать только петлю)
Все, что вам нужно сделать, это заставить Apache использовать этот сценарий bash для каждого файла с .php
расширение (mod_cgi
и mod_actions
позвольте вам это сделать).