7

私はドメイン上にサイトを持っています。それを「」と呼びましょうmydomain.com。そこでは人々がログインできます。このドメインにはサブドメインがありsub.mydomain.comます。

uploadsユーザーがメインドメインにファイルをアップロードしたら、そのファイルをのフォルダに移動したいと思いますsub.mydomain.com。ファイルを移動したいフォルダには、完全な書き込み/読み取り権限があります。

teファイルをアップロードする私のコード:

$filename = 'background_' . $_SESSION['username'] . '.jpg';
if (is_uploaded_file($_FILES['background']['tmp_name'])) 
    {  
        move_uploaded_file($_FILES['background']['tmp_name'], 
        "/var/www/vhosts/mydomain.com/subdomains/sub/httpdocs/uploads/" . $filename);
    }

このコードを実行すると、次の警告/エラーが発生します。

Warning: move_uploaded_file() [function.move-uploaded-file]: open_basedir restriction in effect. File(/var/www/vhosts/mydomain.com/subdomains/sub/httpdocs/uploads/background_User.jpg) is not within the allowed path(s): (/var/www/vhosts/mydomain.com/httpdocs:/tmp) in /var/www/vhosts/dezeactie.nl/httpdocs/opmaak.php  on line 152

誰かが私の問題の解決策を教えてくれますか?

最後に、サブドメインにログインしてファイルを直接アップロードできることはわかっていますが、他の目的のためにメインドメインにログインしたままにしておきたいと思います。

前もって感謝します。

ユルゲン

4

4 に答える 4

4

httpdocsあなたのホスティングサービスは、あなたのスクリプトが各仮想ホストのディレクトリと共有ディレクトリの外で何かをすることを許可していません/tmp。これにより、サイト間の情報交換の可能性が大幅に制限されます。

私が考えることができるトリック:

  1. ソースサイトのディレクトリに一時ファイルを保存し/tmp、ターゲットサイトでプロセスをトリガーしてファイルをフェッチします。これを行うには、curl関数を使用できます。

  2. 共通のデータベースにファイルを保存します。サイトのパフォーマンスに影響を与えると思われる場合は、ストレージを永続的にする必要はありません。ターゲットサイトは、保留中の受信ファイルがあるかどうかを確認する必要があります。

  3. キュー(おそらく内部の特別なディレクトリ)にファイルを追加しhttpdocs、コマンドラインスクリプトを記述してそれらをターゲットサイトにプッシュします。このコマンドをcronで実行します(たとえば、1分に1回)。

私見、#2は実行可能で信頼できるように見えます。

于 2010-06-29T11:50:42.703 に答える
0

エラーメッセージが示すように、ファイルアクセスは、のopen_basedirディレクティブを使用して特定のディレクトリに制限されphp.iniます。

サーバーの構成にアクセスできる場合は、それを変更できます。

于 2010-06-29T11:54:48.220 に答える
0

サブドメインのシンボリックリンクを作成してから、sub.domain.comのURLを介して画像にアクセスしてみませんか?

于 2010-06-29T12:30:50.610 に答える
0

ここでのほとんどの解決策は少し過剰に見えました。私は自分の解決策を書きました。一粒の塩と一緒に取ってください。私はPHPをあまり使用しません。

// MAIN DOMAIN - index.php

/**
 * @param String $target - file name under the image you are saving
 * @param String $subdomain - target subdomain, in which, you wish to save your image
 */
function saveImage($target, $subdomain) {
    $context = stream_context_create(array('http' =>
        array(
            'method' => 'POST',
            'header' => 'Content-type: application/x-www-form-urlencoded',
            'content' => http_build_query(
                array(
                    'target' => $target,
                    'contents' => file_get_contents($_FILES['image_upload']['tmp_name'])
                )
            )
        )
    ));
    
    return file_get_contents('http://' . $subdomain . '.' . $_SERVER['HTTP_HOST'] . '/save_image.php', false, $context);
}

saveImage("test.png", "cdn");


// SUBDOMAIN - save_image.php

file_put_contents($_POST['target'], $_POST['contents']);
    
echo 'http://' . $_SERVER['HTTP_HOST'] . '/' .$target;

これにより、すべてのユーザーが投稿リクエストを行って画像をサブドメインに保存できるようになることに気付きました。ただし、PHPはバックエンドであるため、簡単な代替手段は、PHPで宣言されたキーを渡すことです。すなわち

// MAIN DOMAIN - index.php

$key = "A4g8S8"; // hash this and pass it through the request body


// SUBDOMAIN - save_image.php

if ($_POST['key'] == "A4g8S8") {
    // code here
}
于 2022-01-23T05:55:31.717 に答える