web-dev-qa-db-ja.com

PHPインクルードは常に失敗します

  • SuExecでVirtualHostsを使用するApacheHTTP Server 2.2.21
  • Fcgid経由のPHP5.3.8
  • Arch Linux 2011.08.19

共有ホスティングからVPSに移行中です。移動前に正常に実行されていたコードが、次の行で失敗しています。

_require_once($_SERVER['DOCUMENT_ROOT'] . 'includes/content/header.php');
_

エラーログによると:

PHPの致命的なエラー:require_once():/ srv/www/hostnameでrequired '/ srv/www/hostname/public/includes/content/header.php'(include_path = '。:/ usr/share/pear')を開くことができませんでした3行目の/public/index.php

ドキュメントルート部分なし、_./_ありとなし、同じディレクトリ内のファイルなど、同じ行を試しましたが、うまくいきませんでした。 require、_include_once_、またはincludeとも違いはありません。それでも、エラーログからコピーして貼り付け、ファイルにcdingすることで、ファイルがその正確な場所に存在することを確認できます。

[〜#〜] so [〜#〜] でこの質問をしましたが、誰かがサーバーの問題である可能性が高いと言ったので、ここで言い直します。 (私がここで見つけた最も類似した質問は 答えられなかった でした)試みの要約:

  • 権限の組み合わせは役に立ちません(ディレクトリまたはファイル)。 644から777まで試しました。
  • すべてのファイルは、SuExecユーザー/グループによってchownされます。
  • 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()は効果がありません。
  • コマンドラインから直接_php-cgi_経由でrequireを実行すると、内部サーバーエラーが返され、includeは空白の出力を返します。 phpを介して実行すると、空白の出力が返されます。

これが私の仮想ホスト設定です:

_<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
Hugh Guiney

open_basedir/srv/www/hostname/public/includes/content/の親ディレクトリ以外に設定されているかどうかを確認します。これにより、そのファイルを開いたり含めたりすることがブロックされます。また、開いているファイルがopen_basedirの外部にあるものへのシンボリックリンクではないことを確認してください。

これは通常、open_basedirが原因でファイルがブロックされたことを示す警告レベルのメッセージを出力しますが、エラーが無効になっている(または少なくともE_WARNINGが無効になっている)場合、メッセージは表示されません。

1
DerfK

装置がインストールされていますか?インストールされている場合、Apacheプロセスがアクセスできるものが制限されますか? (/etc/apparmor.dを確認してください)

さらに、次のようなことを試してください。

Sudo -u hostname cat /srv/www/hostname/public/includes/content/header.php

それはあなたに何を与えますか?

1
Alex N