PHP包含总是失败

  • 具有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')失败第3行的/public/index.php

我尝试了没有文档根部分,有和没有./ ,文件在同一目录等相同的行,没有运气。 与requireinclude_onceinclude require没有区别。 但是,我可以通过从错误日志中复制并粘贴到该文件来validation该文件是否存在于该确切位置。

我问这个问题,有人告诉我这可能是一个服务器问题,所以我在这里重述。 (我能find的最类似的问题从来没有回答 )尝试总结:

  • 没有任何权限组合(在目录或文件上); 从644到777尝试。
  • 所有这些文件都由SuExec用户/组更新。
  • PHP将自身报告为在正确的用户/组下运行。
  • Apache&SuExec错误日志不报告。
  • 安全模式在php.ini设置为“关”。
  • dirname(__FILE__)exec('pwd')返回值与$_SERVER['DOCUMENT_ROOT']相同,但没有结尾的斜杠; 前缀与其中一个或另一个没有区别。
  • includeinclude_oncefreadfile_existsfile_get_contentsrealpath(dirname(__FILE__))都返回false。
  • set_include_path()没有效果。
  • 运行require通过直接从命令行php-cgi返回内部服务器错误,而include返回空白输出; 通过php运行返回空白输出。

这是我的虚拟主机configuration:

 <VirtualHost *:80> ServerAdmin [email protected] 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> 

检查是否将open_basedir设置为/srv/www/hostname/public/includes/content/的父目录以外的其他目录。 这会阻止开放或包含该文件。 另外请确保您打开的文件不是符合open_basedir之外的符号链接。

这通常会打印一个警告级别的消息,指出该文件由于open_basedir而被阻止,但是如果您禁用了错误(或者至less禁用了E_WARNING),那么您将看不到该消息。

你有没有安装akramor,如果是这样,它限制了什么apache进程可以访问? (检查/etc/apparmor.d)

另外尝试做这样的事情:

sudo -u主机名cat /srv/www/hostname/public/includes/content/header.php

它给你什么?