Apache-2.2

PHP 包含總是失敗

  • October 30, 2011
  • 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或, 也沒有區別includecd然而,我可以通過從錯誤日誌中複製粘貼並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

它給了你什麼?

引用自:https://serverfault.com/questions/326028