1

我正在使用 Apache(由于客户的原因,无法切换到 nginx 或 lighttpd),和其他许多人一样,我对以下变量有问题:

$_SERVER["SCRIPT_FILENAME"]
$_SERVER["PATH_TRANSLATED"]
$_SERVER["DOCUMENT_ROOT"]

由于 chroot,apache 的 mod_fastcgi 传递给 php5-fpm 的变量被搞砸了,因此与正确的不匹配。
让我给你看一个例子:

$_SERVER["DOCUMENT_ROOT"] = /home/vhosts/h0001/home/domains/test.com
$_SERVER["SCRIPT_FILENAME"] = /home/vhosts/h0001/php-fpm
$_SERVER["PATH_TRANSLATED"] = /home/vhosts/h0001/home/domains/test.com/phpinfo.php

代替:

$_SERVER["DOCUMENT_ROOT"] = /home/domains/test.com
$_SERVER["SCRIPT_FILENAME"] = /php-fpm
$_SERVER["PATH_TRANSLATED"] = /home/domains/test.com/phpinfo.php

所以,这似乎很容易做到,因为我只需要从这些变量中删除“/home/vhosts/hXXXX”。

我曾想过在 php.ini 中使用 auto_prepend_file 指令并添加如下内容:

<?php
    $_SERVER['SCRIPT_FILENAME'] = str_replace('/home/vhosts/h0001','',$_SERVER['SCRIPT_FILENAME'])
    $_SERVER['PATH_TRANSLATED'] = str_replace('/home/vhosts/h0001','',$_SERVER['PATH_TRANSLATED'])
    $_SERVER['DOCUMENT_ROOT'] = str_replace('/home/vhosts/h0001','',$_SERVER['DOCUMENT_ROOT'])

这将允许设置正确的变量,但是我有两个问题:

  • 我无法添加任何文件,因为 php 根本不起作用(“没有输入文件。”),因为它在错误的目录中查找脚本
  • 在虚拟主机中设置别名似乎不起作用,因为 chroot 环境发生在 /home/vhosts/hXXXX 上,并且各种域 docroot 位于 /home/vhosts/hXXXX/home/domains/domain.tld/;即使使用别名,Apache 仍然会给出错误的路径。

我见过很多人用 nginx 处理它,解决问题(允许编辑 SCRIPT_FILENAME 和 DOCUMENT_ROOT,Apache 不允许),以及其他人解决问题,在 chroot 中符号链接适当的目录树解决问题. 最后一个解决方案真的很糟糕。

另一种方法是使用这个补丁,但即使尝试它,似乎也出了点问题:尝试用apxs2 -cia mod_fastcgi.c编译它,抛出一个关于undefined symbol: fcgi_config_new_static_server的错误,我不知道如何解决这个问题(编译静态?如何用 apxs2 来做?)

关于它的最佳解决方案似乎是手动修补 PHP,但我不确定这是否是最干净的事情......!

4

0 回答 0