我正在从共享主机迁移到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
我尝试了没有文档根部分,有和没有./
,文件在同一目录等相同的行,没有运气。 与require
, include_once
或include
require
没有区别。 但是,我可以通过从错误日志中复制并粘贴到该文件来validation该文件是否存在于该确切位置。
我问这个问题,有人告诉我这可能是一个服务器问题,所以我在这里重述。 (我能find的最类似的问题从来没有回答 )尝试总结:
php.ini
设置为“关”。 dirname(__FILE__)
和exec('pwd')
返回值与$_SERVER['DOCUMENT_ROOT']
相同,但没有结尾的斜杠; 前缀与其中一个或另一个没有区别。 include
, include_once
, fread
, file_exists
, file_get_contents
和realpath(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
它给你什么?