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

Я запускаю веб-сервер с несколькими пользователями. Машина предоставляет виртуальные хосты на основе Apache группе пользователей, которые могут обслуживать статический контент или использовать PHP. Другие формы серверных сценариев недоступны.

Вот как обрабатывается типичный запрос:

Блок-схема обработки запросов

Для трафика HTTPS его SSL отбрасывается 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?

1 ответ

Самый простой способ найти это, бросив mod_php и вместо этого использовать скрипт CGI. Это позволяет вам позвонить php-cgi (CGI-ориентированная версия интерпретатора PHP) из сценария оболочки, который выполняется при загрузке страницы.

Вот пример скрипта 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 позвольте вам сделать это).

Другие вопросы по тегам