我使用的是 Debian 9 和 PHP-FPM 7.0.26-2
,以及5.6.32-1
来自存储库 deb.sury.org 的版本。同样的配置在 Debian 8 服务器上使用 PHP-FPM 运行良好5.6.30
- 我已经
pool.d/user.conf
从该服务器复制了。 - 两个
php.ini
文件都有cgi.fix_pathinfo=1
。 - 该参数也是强制使用
php_admin_value[cgi.fix_pathinfo] = 1
。 两个服务器都以类似的方式使用此池
<VirtualHost>
:ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/user.sock|fcgi://localhost/home/user/public_html
现在,有一个 AJAX 页面需要从PATH_INFO
(可能是PATH_TRANSLATED
) 读取路径。但是,虽然这些变量在 Debian 8 服务器上具有正确的内容:
["SCRIPT_NAME"]=>
string(14) "/path/ajax.php"
["ORIG_SCRIPT_NAME"]=>
string(25) "/path/ajax.php/para/meters"
["PATH_INFO"]=>
string(12) "/para/meters"
["PATH_TRANSLATED"]=>
string(34) "/home/user/public_html/para/meters"
它们在新版 Debian 9 + dub.sury.org 上的工作方式似乎有所不同:
["SCRIPT_NAME"]=>
string(25) "/path/ajax.php/para/meters"
["PATH_TRANSLATED"]=>
string(22) "/home/user/public_html"
并且参数ORIG_SCRIPT_NAME
和PATH_INFO
完全缺失。
答案1
这是我使用 proxy_fcgi 的方式。如示例中所述mod_proxy_fcgi
:
您还可以通过创建合适的处理程序传递来强制将请求作为反向代理请求处理。——这种形式的好处是它允许在服务器中发生 URI 到文件名的正常映射,并且本地文件系统结果传递到后端。当 FastCGI 这样配置时,服务器可以计算出最准确的
PATH_INFO
。
所以我更换了我的
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/user.sock|fcgi://localhost/home/user/...
与 Handler 和 Worker 一起使用:
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/user.sock|fcgi://localhost"
</FilesMatch>
<Proxy "fcgi://localhost/" enablereuse=on max=10>
</Proxy>
现在所有 AJAX 请求均运行正常。
奖金:如果有人知道为什么能够在我的 Debian 8 / Apache 2.4.10 / PHP-FPM 5.6.30 上ProxyPassMatch
计算,PATH_INFO
但在 Debian 9 上却不行,那就太棒了。
答案2
正如所描述的:
https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html#env
ProxyPassMatch 未设置 PATH_INFO 的原因如下:
环境变量
除了控制 mod_proxy 行为的配置指令之外,还有许多控制 FCGI 协议提供程序的环境变量:
代理-fcgi-路径信息:通过 ProxyPass 或 ProxyPassMatch 配置时,mod_proxy_fcgi 将不会设置 PATH_INFO 环境变量。这允许后端 FCGI 服务器正确确定 SCRIPT_NAME 和 Script-URI 并符合 RFC 3875 第 3.3 节。如果您需要 mod_proxy_fcgi 为 PATH_INFO 生成“最佳猜测”,请设置此环境变量。这是解决某些 FCGI 实现中的错误的一种方法。可以将此变量设置为多个值,以调整如何选择最佳猜测(仅在 2.4.11 及更高版本中):
第一个点:PATH_INFO 由 URL 中第一个“.”后面的斜杠分割而成。
最后一个点:PATH_INFO 由 URL 中最后一个“.”后面的斜杠分割而成。
满的:PATH_INFO 是通过尝试将 URL 映射到本地文件系统来计算的。
取消转义:PATH_INFO 是 URL 的路径组件,未转义/解码。
任何其他值:PATH_INFO 与 URL 的路径部分相同。最初,这是唯一的 proxy-fcgi-pathinfo 选项。