Не удается правильно проанализировать аргументы слэша с помощью 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 =
1 ответ
Нашел это.
После погружения в сам код для создания лучшей отладочной информации проблема оказалась в том, что 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
Материал теперь проходит правильно, и сайт, кажется, работает.