我最近在使用 Apache 2.4 和 PHP7 的 Debian Stretch 系统上通过proxy_fcgi
和php-fpm
.
它在测试阶段运行良好,但第一个客户正在使用一个 Moodle 网站,该网站大量使用了所谓的“斜线参数”(IE,请求,比如说,index.php/these/are/parameters/
)。
按照moodle网站上的说明,我尝试设置AcceptPathInfo
为On,甚至尝试security_limit_extensions
在PHP中禁用,但到目前为止似乎没有任何效果。
相关配置粘贴在下面。我很肯定我在某个地方错过了一些简单的东西,但是我已经没有想法去哪里看。
(注意:常规 php 工作正常;斜杠参数不能。当设置cgi.fix_pathinfo
为 0 时要求https://www.domain.nl/lib/javascript.php/foo/bar
“未指定输入文件”;将其设置为 1 会导致“未找到有效的 Javascript 文件”,这至少表明该脚本被调用但参数没有正确传递给代理......)
阿帕奇:
<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
:东西现在可以正确通过,并且该站点似乎可以正常工作。