web-dev-qa-db-ja.com

ドキュメントルートの外にファイルをインクルードする方法は?

私がしたいのは、「domain1」の「file1.php」を「domain2」の「file2.php」に含めることです。だから私がやるべきだと思ったのは次のようなものです:

file2.php
require_once '/var/www/vhosts/domain1/httpdocs/file1.php';

しかし、これは私が本当に理解できない理由で機能しません。だから私がしたことは、自分のパスをインクルードパスに追加することでした。何かのようなもの:

file2.php
set_include_path(get_include_path() . PATH_SEPARATOR . "/var/www/vhosts/domain1/httpdocs");
require_once 'file1.php';

それで、私がどこで間違っているのかについて、いくつかのヒントを教えていただけますか?

ありがとう

更新-どちらの方法でも、次のエラーメッセージが表示されます。

Fatal error: require() [function.require]: Failed opening required '/var/www/vhosts/domain1/httpdocs/file1.php' (include_path='.:/php/includes:/usr/share/pear/') in /var/www/vhosts/domain2/httpdocs/file2.php on line 4

また、safe_modeのオンとオフの両方でこれを試しました。

UPDATE2:また、テストファイルのアクセス許可を777に変更し、bashのインクルードファイルへのパスを再確認しました。

解決策:謎を解くことができました!私のホスティング会社は、Pleskを使用してドメインなどを管理しています。また、php.iniのエラー報告レベルはE_ALLではありませんでした。エラーレポートをE_ALLに設定すると、次のような警告が表示されました。

Warning: require() [function.require]: open_basedir restriction in effect.

そこで、/ var/www/vhosts/domain2/conf/httpd.includeにアクセスして、open_basedirパスを編集しました。ドメイン設定が変更されるたびにこの設定ファイルがpleskによって書き換えられるため、これは永続的なソリューションではないことに注意してください。同じディレクトリにある「vhost.conf」ファイルを編集(または作成)してから、次のコマンドを実行する必要があります。

 /usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=DOMAIN.TLD

これでドメインの設定が再構成されますが、奇妙な理由でopen_basedirでは機能しません。 document_rootのような他のものを変更することはできますが、open_basedirは変更されませんが、それは別の問題です:D

解決策の最終:同じ問題を抱えている人のために、ここに機能した最終的なコードがあります。これを/var/www/vhosts/domain2/conf/vhost.confに追加しました(「/ var/www/vhosts」を「/」または好きなものに変更できます):

    <Directory /var/www/vhosts/DOMAIN.TLD/httpdocs>
    <IfModule mod_php5.c>
            php_admin_flag engine on
            php_admin_flag safe_mode off
            php_admin_value open_basedir "/var/www/vhosts"
    </IfModule>
            Options -Includes -ExecCGI
    </Directory>

みんなありがとう!

17
Brayn

open_basedirが有効な場合、これを実行することはできません。これにより、PHPがホームディレクトリから移動できなくなります。

できることは、docroot1とdocroot2が同じグループのユーザーによって所有されていることを確認し、それに応じてグループのアクセス許可を設定し、docroot2からdocroot1へのシンボリックリンクを使用して他のWebルートを読み取ることです。

または、PHPを再構築し、他のすべてのプロセスと同様に、通常の* nix権限に従うようにします:)

9
Tim Post

PHPスクリプトの権限、または セーフモード)を除いて、どこからでもファイルを含めることができます それを防ぎます。最初のアプローチはまったく問題ありません。どのようなエラーが発生しますか?

コメントに関しては、PHP内から確実に存在するファイルへのアクセスがないことを確認しているようです。それが何であるかについては、Suhosinが除外されたので、私ができる唯一のことはPHPまたはApacheはある種のaa chroot Jail

Chroot jailの主な利点は、jailが、デーモンが参照できるファイルシステムの部分をjailのルートディレクトリに制限することです。さらに、jailはApacheをサポートするだけでよいため、jailで使用できるプログラムは非常に制限される可能性があります。最も重要なことは、rootアクセスを取得してjailから抜け出すために使用できるsetuid-rootプログラムが必要ないことです。

私はこのようなものを使ったことがないので、それを見つける方法を説明することはできません(_/var/www/vhosts_でglob()を実行し、何が起こるかを確認することを除いて。しかし、これは必要だと思います管理者によって設定されています。誰があなたのマシンを実行しますか?

2
Pekka

これは私が管理するいくつかのマシンで動作します

ini_set("include_path",".:/hsphere/local/home/user_name/other_domain.com");
require "filename.php";

私はここに座って、なぜあなたがシンボリックリンクをしなかったのか疑問に思います。それとも私は何かを間違えましたか?必要なインクルードを含むフォルダーを、アクセスできるパスにシンボリックリンクできます。

1
naugtur

あなたが使っているのは悪い習慣です。依存コードをドメイン固有に置きます。同じコードを複製することは、両方のサイトの操作に影響を与えないため、正しいアプローチです。

File1.phpのシンボリックリンクを作成して、ローカルディレクトリからのものであるかのように含めてみてください。

また、.htaccessのfollowsymlinkオプションがtrueに設定されていることを確認してください

domain2のfile2.phpでこれを試してみませんか?

require_once '../../../ domain1/httpdocs/file1.php';

0
coder

テストphpファイルでchmod777を試して、アクセス許可の問題がある場合は、それが機能するかどうかを確認してください。また、簡単なphpinfo()を実行して、保存モードがオンになっているかどうかを確認します。

0
douwe

別のファイルを要求しようとするとどうなりますか?

// test.php
<?php
   echo 'Hello World';
?>

// your file
require_once('test.php');

それは動作しますか?その場合は、test.phpを別の場所に配置して、再試行してください。それでも機能しますか?

0
Chuck Burgess