我正在使用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'])
这将允许设置正确的变量,但是我有两个问题:
我见过很多人用nginx处理它,解决问题(允许编辑SCRIPT_FILENAME和DOCUMENT_ROOT,Apache没有),以及其他人解决问题symlinking相应的目录树里面< / em> chroot解决问题。最后一个解决方案真的很糟糕。
另一种方法是使用this patch,但即使尝试它,似乎出现了问题:尝试用 apxs2 -cia mod_fastcgi.c 编译它,抛出一个错误未定义的符号:fcgi_config_new_static_server ,我不知道如何解决这个问题(编译静态?如何用apxs2做?)
关于它的最佳解决方案似乎是手动修补PHP,但我不确定它是最干净的事情......!