PHP 包含总是失败

PHP 包含总是失败
  • Apache HTTP Server 2.2.21 带有 SuExec 下的 VirtualHosts
  • 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/public/index.php 第 3 行中打开所需的‘/srv/www/hostname/public/includes/content/header.php’(include_path=‘.:/usr/share/pear’)

我尝试了没有文档根目录部分的同一行,./在同一目录中有和没有 、 文件等,但都没有成功。 有requireinclude_once、 或也没有区别。 但是,我可以通过从错误日志中复制粘贴并进入该日志来include验证该文件是否存在于该确切位置。cd

我问了这个问题所以有人告诉我这可能是服务器问题,所以我在这里重申一下。(我在这里找到的最相似的问题是从未回答)尝试总结:

  • 任何权限组合都无济于事(对于目录或文件);已尝试从 644 到 777。
  • 所有文件均由 SuExec 用户/组拥有。
  • PHP 报告其自身在正确的用户/组下运行。
  • Apache 和 SuExec 错误日志未报告任何内容。
  • 中安全模式设置为“关闭” php.ini
  • dirname(__FILE__)exec('pwd')返回与 相同的内容$_SERVER['DOCUMENT_ROOT'],但没有尾随斜杠;以其中一个为前缀没有任何区别。
  • include,,,,,和include_once均返回false 。freadfile_existsfile_get_contentsrealpath(dirname(__FILE__))
  • set_include_path()没有效果。
  • 直接从命令行运行requirevia会返回内部服务器错误,同时返回空白输出;运行任一 via都会返回空白输出。php-cgiincludephp

这是我的虚拟主机配置:

<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>

答案1

检查您是否拥有open_basedir设置为 的父目录以外的内容/srv/www/hostname/public/includes/content/。这会阻止打开或包含该文件。还要确保您打开的文件不是指向 open_basedir 之外的某个文件的符号链接。

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

答案2

您是否安装了 apparamor,如果是,它是否限制了 apache 进程可以访问的内容?(检查 /etc/apparmor.d )

另外尝试做这样的事情:

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

它给你什么了?

相关内容