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

Как исправить SCRIPT_NAME с PHP-FPM и Apache mod_fastcgi?

В моей конфигурации Apache есть следующее, чтобы заставить PHP-FPM работать:

FastCgiExternalServer /srv/www/fast-cgi-fake-handler -host 127.0.0.1:9000
AddHandler php-fastcgi .php
AddType text/html .php
Action php-fastcgi /var/www/cgi-bin
Alias /var/www/cgi-bin /srv/www/fast-cgi-fake-handler
DirectoryIndex index.php

Это отлично работает, за исключением того, что SCRIPT_NAME всегда /var/www/cgi-bin а некоторые сценарии используют SCRIPT_NAME для определения местоположения текущего сценария (vBulletin).

У Google есть множество решений для Nginx, но ни слова для Apache.

Если вы используете RewriteRule вместо метода «Action», все будет хорошо.

Ниже приведен пример, который я использовал в Apache для подключения к внешнему процессу демона fastcgi FCGI :: Daemon. Этот демон можно рассматривать как perl-версию php-fpm.

<VirtualHost 127.0.0.1:80>
    ServerAdmin info@example.com
    DocumentRoot "/var/www/example"
    ServerName www.example.com

    <IfModule mod_fastcgi.c>
    FastCGIExternalServer /var/www/fcgi-daemon/perl.fcgi -socket /var/run/fcgi-daemon.sock
    ScriptAlias /perl.fcgi /var/www/fcgi-daemon/perl.fcgi
    </IfModule>
</VirtualHost>

<Directory /var/www/example/cgi-bin>
    Options ExecCGI
    RewriteRule ^(.*)$ /perl.fcgi [L]
</Directory>

Примечание: "/ var / www / fcgi-daemon /" должен существовать! как пустой каталог. Фактически метод, который вы использовали для php, не работает из коробки для демона perl. SCRIPT_FILENAME всегда был /var/www/fcgi-daemon/perl.fcgi, который никогда не существовал, что приводило к ошибке. Использование RewriteRule сохраняет все необходимые переменные среды на месте и передает их демону perl fastcgi.

Я обнаружил, что при установке FastCgiExternalServer в существующий каталог (вероятно, работает и для файла), например /srv/www тогда все переменные PHP были установлены правильно. Однако весь контент, не относящийся к PHP, будет служить либо text/html или text/plain что не очень хорошо. Также DirectoryIndex перестало иметь эффект, напоминающий мне этот вопрос на StackOverflow но я ничего не мог поделать с его решением жонглирования абсолютными и относительными путями.

Единственный релевантный результат Google для PHP-FPM, Apache и SCRIPT_NAME: комментарий кого-то по имени Димас кто так говорит этот метод исправил это для него, но мне не повезло.

Я прибег к настройке auto_prepend_file в моем php.ini в файл, содержащий следующее:

<?php
$_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED'];
unset($_SERVER['PATH_TRANSLATED']);
$_SERVER['SCRIPT_NAME'] = $_SERVER['PATH_INFO'];
unset($_SERVER['PATH_INFO']);

Не лучшее решение, но, по крайней мере, мне не нужно вручную редактировать vBulletin, Wordpress и т. Д.

Вы можете исправить это, убедившись, что cgi.fix-pathinfo в вашем php.ini установлено значение 1. Это заставляет PHP заполнять массив $ _SERVER, как и следовало ожидать при выполнении PHP как CGI / FastCGI на Apache.

https://serverfault.com/a/423965/118969 от ColtonCat выше, это лучший ответ. Я пробовал использовать nginx (ssl-reverse-proxy) -> apache -> php53-fpm.

при использовании nginx (ssl-reverse-proxy) -> apache + mod_php, ты можешь использовать cgi.fix_pathinfo = 0