Apache 2.4 + PHP-FPM и заголовки авторизации
Описание: mod_proxy в Apache 2.4, похоже, не передает заголовки авторизации в PHP-FPM. Есть ли способ это исправить?
Длинная версия: я использую сервер с Apache 2.4 и PHP-FPM. Я использую APC для кэширования кода операции и пользовательского кэширования. В соответствии с рекомендациями Интернета я использую mod_proxy_fcgi в Apache 2.4 для прокси-запросов к FPM, например:
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/foo/bar/$1
Настройка работает нормально, за исключением одного: встроенный в APC файл apc.php, используемый для мониторинга состояния APC, не позволяет мне входить в систему (требуется для просмотра записей кэша пользователя). Когда я нажимаю "Записи кэша пользователя", чтобы увидеть кэш пользователя, он запрашивает у меня вход в систему, при нажатии на кнопку входа в систему отображается обычная форма входа в HTTP, но ввод правильного имени пользователя и пароля не дает успеха. Эта функция отлично работает при запуске с mod_php вместо mod_proxy + php-fpm.
После некоторого поиска в Google я обнаружил, что у других людей возникла та же проблема, и выяснил, что это связано с тем, что Apache не передает HTTP-заголовки авторизации во внешний процесс FastCgi. К сожалению, я нашел только исправление для mod_fastcgi, которое выглядело так:
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
Есть ли эквивалентная настройка или какой-то обходной путь, который также будет работать с mod_proxy_fcgi?
5 ответов
Различные модули Apache будут лишать Authorization
заголовок, обычно по "соображениям безопасности". Все они имеют разные скрытые настройки, которые вы можете изменить, чтобы отменить это поведение, но вам нужно точно определить, какой модуль виноват.
Вы можете обойти эту проблему, передав заголовок непосредственно в PHP через env:
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
См. Также Zend Server Windows - заголовок авторизации не передается в сценарий PHP
Это заняло у меня много времени, так как это не задокументировано в mod_proxy или mod_proxy_fcgi.
Добавьте следующую директиву в ваш apache conf или.htaccess:
CGIPassAuth on
Смотрите здесь для деталей.
В последнее время у меня не было проблем с этой аркой.
В моей среде прокси для php-fpm был настроен следующим образом:
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache2/htdocs/$1
ProxyTimeout 1800
</IfModule>
Я исправил проблему, установив директиву SetEnvIf следующим образом:
<IfModule proxy_module>
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache2/htdocs/$1
ProxyTimeout 1800
</IfModule>
Я добавил
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
внутри узла VirtualHost
<VirtualHost *:80>
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
Я не нашел подобных настроек с mod_proxy_fcgi, НО он просто работает для меня по умолчанию. Он запрашивает авторизацию пользователя (как обычно.htaccess), и php получает его, и работает как с mod_php или fastcgi и pass-header. Я не знаю, был ли я полезным...
РЕДАКТИРОВАТЬ: он работает только на teszt.com/ при использовании DirectoryIndex... Если я передаю имя файла php (даже если index.php!), Он просто не работает, не передавайте аутентификацию php. Это блокировщик для меня, но я не хочу переходить на apache 2.2 (и mod_fastgi), поэтому я перехожу на nginx (на этой машине тоже).