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

Неспособность правильно разобрать аргументы косой черты с помощью php-fpm / apache

Недавно я установил новый сервер веб-хостинга в системе Debian Stretch с использованием Apache 2.4 и PHP7 через proxy_fcgi и php-fpm.

На этапах тестирования он работал нормально, но первый клиент использует веб-сайт Moodle, который широко использует так называемые «аргументы косой черты» (IE, запросы к, скажем, index.php/these/are/parameters/ ).

Следуя инструкциям на сайт moodle Я пробовал установить AcceptPathInfo на Вкл, и даже пробовал отключить security_limit_extensions в PHP, но пока ничего не работает.

Соответствующие конфиги вставлены ниже. Я уверен, что пропустил кое-что простое где-то, но у меня закончились идеи, где искать.

(Примечание: обычный php работает нормально; аргументы с косой чертой - нет. При настройке cgi.fix_pathinfo до 0 просит https://www.domain.nl/lib/javascript.php/foo/bar приводит к «Не указан входной файл»; установка значения 1 приводит к появлению сообщения «Не найдены допустимые файлы Javascript», что, по крайней мере, предполагает, что скрипт вызывается, но аргументы не передаются правильно в прокси ...)

Apache:

<VirtualHost *:443>
    ServerName www.domain.nl
    ServerAlias domain.nl new.domain.nl

    DocumentRoot /home/webclients/www.domain.nl/public_html/
    Alias /cgi-bin/ /home/webclients/www.domain.nl/cgi-bin/
    CustomLog /var/log/apache2/www.domain.nl/access.log combined
    ErrorLog /home/webclients/www.domain.nl/logs/error.log
    TransferLog /home/webclients/www.domain.nl/logs/access.log

    ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/var/run/php-fpm/domain.sock|fcgi://localhost/home/webclients/www.domain.nl/public_html
    SSLOptions +StdEnvVars

    <IfModule mod_suexec.c>
        SuExecUserGroup domain webclients
    </IfModule>

    <Directory /home/webclients/www.domain.nl/public_html/>
        AllowOverride All
        AcceptPathInfo On
        Require all granted
    </Directory>

    SSLEngine on
    #       LogLevel info
    SSLCertificateFile /etc/ssl/certs/www.domain.nl.pem
    SSLCertificateKeyFile /etc/ssl/private/www.domain.nl.key
    SSLCACertificateFile /etc/ssl/intermediate/intermediate-rapidssl-rsacag1.pem
    # Enable HSTS
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"



</VirtualHost>
# vim:syntax=apache

файл пула php-fpm:

[domain]

prefix=/

include=/etc/php/7.0/fpm/pool.d/defaults

php_admin_value[error_log] = /home/webclients/www.domain.nl/logs/php-error.log
php_admin_value[cgi.fix_pathinfo] = 0
security.limit_extensions = 

Нашел.

После погружения в сам код, чтобы сгенерировать лучшую отладочную информацию, проблема оказалась в том, что mod_proxy_fcgi по умолчанию не передает серверную переменную PATH_INFO клиенту.

Способ исправить это - использовать SetEnvIf:

SetEnvIf REQUEST_URI "^/(.*\.php(/.*)?)$" proxy-fcgi-pathinfo
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/var/run/php-fpm/domain.sock|fcgi://localhost/home/webclients/www.domain.nl/public_html

Теперь все проходит правильно, и сайт работает.