【发布时间】:2011-10-29 15:31:36
【问题描述】:
- Apache HTTP Server 2.2.21 和 SuExec 下的 VirtualHosts
- 通过 fcgid 的 PHP 5.3.8
- Arch Linux 2011.08.19
我正在从共享主机迁移到 VPS。我在移动之前运行良好但现在在这一行失败的代码:
require_once($_SERVER['DOCUMENT_ROOT'] . 'includes/content/header.php');
错误日志说:
PHP 致命错误:require_once():打开失败 必需的'/srv/www/hostname/public/includes/content/header.php' (include_path='.:/usr/share/pear') 在 /srv/www/hostname/public/index.php 在第 3 行
我尝试了没有文档根部分、有和没有./ 等的同一行,但没有运气。与require、include_once 或include 也没有区别。然而,我可以通过从错误日志中复制粘贴并cding 来验证该文件是否存在于该确切位置......
但为了绝对确定,我测试了 includes 和 file_exists 的返回值——它们都返回 false。然而,所有文件都由 SuExec 用户/组 chown'd,并且权限组合没有帮助(在目录或文件上);从644到777都试过了,这是怎么回事?
编辑:
- 相同目录下的文件结果相同。
- Apache 和 SuExec 错误日志不报告任何内容。
-
php.ini中的安全模式设置为“关闭”。 -
dirname(__FILE__)和exec('pwd')返回与$_SERVER['DOCUMENT_ROOT']相同的结果,但没有尾部斜杠。 -
fread、file_get_contents和realpath(dirname(__FILE__))都返回 false。 -
set_include_path()无效。 - 直接从命令行通过
php-cgi运行require返回内部服务器错误,而include返回空白输出;通过php运行会返回空白输出。
这是我的虚拟主机配置:
<VirtualHost *:80>
ServerAdmin admin@hostname.com
DocumentRoot "/srv/www/hostname/public/"
ServerName hostname.com
ServerAlias www.hostname.com
SuexecUserGroup hostname hostname
ErrorLog "/srv/www/hostname/logs/error.log"
LogLevel debug
CustomLog "/srv/www/hostname/logs/access.log" combined
<Directory /srv/www/hostname/public>
Order allow,deny
Allow from all
</Directory>
# http://www.linode.com/forums/viewtopic.php?t=2982
<IfModule !mod_php5.c>
<IfModule !mod_php5_filter.c>
<IfModule !mod_php5_hooks.c>
<IfModule mod_actions.c>
<IfModule mod_alias.c>
<IfModule mod_mime.c>
<IfModule mod_fcgid.c>
AddHandler php-fcgi .php
Action php-fcgi /fcgid-bin/php-fcgid-wrapper
Alias /fcgid-bin/ /srv/www/hostname/fcgid-bin/
<Location /fcgid-bin/>
SetHandler fcgid-script
Options +ExecCGI
Order allow,deny
Allow from all
</Location>
ReWriteEngine On
ReWriteRule ^/fcgid-bin/[^/]*$ / [PT]
</IfModule>
</IfModule>
</IfModule>
</IfModule>
</IfModule>
</IfModule>
</IfModule>
</VirtualHost>
【问题讨论】:
-
因为他使用 php 5.3 功能已被弃用,根据:php.net/manual/en/features.safe-mode.php
-
我还确保在
php.ini中将安全模式明确设置为“关闭”。 -
你能检查一下用户运行的是什么:fcgid
-
我发现了一些可能有帮助的东西:webhostchat.co.uk/hosting-software-additional-add-products/…
-
是 SuExec 用户,拥有 docroot 中所有文件和目录的同一用户。
标签: php apache2 mod-fcgid suexec