Назад | Перейти на главную страницу

Дайте PHP поддельный URL-адрес запроса и протокол с помощью Apache2 и mod_php

Я запускаю веб-сервер с несколькими пользователями. Машина предоставляет виртуальные хосты на основе 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 позвольте вам это сделать).