17

私がやりたいことは、「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

また、セーフモードのオンとオフの両方でこれを試しました。

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>

みんなありがとう!

4

7 に答える 7

9

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

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

または、PHP を再構築し、他のすべてのプロセスと同様に、典型的な *nix パーミッションに従うようにします :)

于 2010-03-09T11:57:46.897 に答える
2

PHP スクリプトのアクセス許可またはセーフ モードで禁止されていない限り、任意の場所からファイルを含めることができます。最初のアプローチはまったく問題ありません。どのようなエラーが発生しますか?

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

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

私はこのような作業をしたことがないので、それを見つける方法を説明することはできません ( glob()onを実行し/var/www/vhostsて何が起こるかを確認する以外は。しかし、これは管理者によって設定されている必要があると思います。 ?

于 2010-03-03T09:39:33.410 に答える
2

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

ini_set("include_path",".:/hsphere/local/home/user_name/other_domain.com");
require "filename.php";
于 2010-03-13T18:22:19.003 に答える
1

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

于 2010-03-13T16:08:59.247 に答える
0

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

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

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

それは動作しますか?その場合は、test.php を別の場所に置いて、もう一度試してください。それはまだ動作しますか?

于 2010-03-08T19:12:57.687 に答える
0

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

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

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

domain2 の file2.php でこれを試してみてはどうでしょうか?

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

于 2010-03-08T10:20:38.417 に答える
0

テストphpファイルでchmod 777を試して、それが機能するかどうかを確認してください.権限の問題がある場合. また、単純な phpinfo() を実行して、保存モードがオンになっているかどうかを確認します。

于 2010-03-08T10:21:55.543 に答える