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’) 失敗/public/index.php 在第 3 行
我在沒有文件根部分的情況下嘗試了同一行
./
,在同一目錄中使用和不使用 , 文件等,但沒有運氣。require
與,include_once
或, 也沒有區別include
。cd
然而,我可以通過從錯誤日誌中複製粘貼並ing 來驗證該文件是否存在於該確切位置。我在SO上問了這個問題,有人告訴我這可能是伺服器問題,所以我在這裡重申。(我在這裡能找到的最相似的問題從未得到回答)嘗試總結:
- 權限組合沒有幫助(在目錄或文件上);從644到777都試過了。
- 所有文件都由 SuExec 使用者/組 chown’d。
- PHP 報告自己在正確的使用者/組下執行。
- Apache & SuExec 錯誤日誌不報告任何內容。
- 中的安全模式設置為“關閉”
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
這是我的虛擬主機配置:
<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>
檢查您是否
open_basedir
設置了/srv/www/hostname/public/includes/content/
. 這將阻止打開或包含該文件。還要確保您打開的文件不是指向 open_basedir 之外的內容的符號連結。這通常會列印一條警告級別的消息,表明該文件由於 open_basedir 而被阻止,但如果您禁用了錯誤(或至少禁用了 E_WARNING),那麼您將看不到該消息。
您是否安裝了 apparamor,如果有,它是否限制了 apache 程序可以訪問的內容?(檢查 /etc/apparmor.d )
另外嘗試做這樣的事情:
sudo -u 主機名 cat /srv/www/hostname/public/includes/content/header.php
它給了你什麼?