无法使用 php-fpm/apache 正确解析斜线参数

无法使用 php-fpm/apache 正确解析斜线参数

我最近在 Debian Stretch 系统上通过proxy_fcgi和使用 Apache 2.4 和 PHP7 建立了一个新的网络托管服务器php-fpm

它在测试阶段运行良好,但第一个客户正在使用 Moodle 网站,该网站大量使用所谓的“斜线参数”(即请求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 文件”,这至少表明脚本被调用,但参数未正确传递到代理中...)

阿帕奇:

<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

现在,内容可以正确传输,站点似乎可以正常运行。

相关内容