- SuExec 下带有 VirtualHosts 的 Apache HTTP Server 2.2.21
- PHP 5.3.8 通过 fcgid
- Arch Linux 2011.08.19
我正在从共享主机迁移到 VPS。我在搬家之前运行良好但现在在这一行失败的代码:
require_once($_SERVER['DOCUMENT_ROOT'] . 'includes/content/header.php');
错误日志说:
PHP 致命错误:require_once():在 /srv/www/hostname 中打开所需的 '/srv/www/hostname/public/includes/content/header.php' (include_path='.:/usr/share/pear') 失败/public/index.php 在第 3 行
我尝试了没有文档根部分的同一行,有和没有./
,等等,但没有运气。require
与,include_once
或, 也没有区别include
。然而,我可以通过从错误日志中复制粘贴来验证该文件是否存在于该确切位置cd
……</p>
但为了绝对确定,我测试了include
s 的返回值以及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()
没有效果。- 直接从命令行运行
require
通过返回内部服务器错误,同时返回空白输出;通过运行任一返回空白输出。php-cgi
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>