5

Amazon s3 用の署名付き $URL を作成しましたが、ブラウザで完全に開きます。

http://testbucket.com.s3.amazonaws.com/100-game-play-intro-1.m4v?AWSAccessKeyId=AKIAJUAjhkhkjhMO73BF5Q&Expires=1378465934&Signature=ttmsAUDgJjCXepwEXvl8JdFu%2F60%3D

**この例ではバケット名とアクセスキーが変更されています

ただし、以下の関数を使用して(curlを使用して)ファイルが存在することを確認しようとしています。CURL 接続に失敗します。上記の $URL を s3 以外の画像の URL に置き換えると、このコードは完全に機能します。

ファイルが amazon に存在することは知っていますが、上記のように署名付き URL を使用すると、このコードが失敗する理由がわかりません

何か案は?

ありがとう

これが私のコードです。

function remoteFileExists($url) {

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    //don't fetch the actual file, only get header to check if file exists
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, true);

    $result = curl_exec($ch);
    curl_close($ch);



    if ($result !== false) {

        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);  

        if ($statusCode == 200) {
            $ret = true;   
        } else {
            $ret = false;
        }

    } else {
        $ret='connection failed';
    }

    return $ret;

}
4

2 に答える 2

4

CURLOPT_NOBODYを使用すると、libcurl はHEADリクエストではなく HTTP リクエストを送信しますGET

...署名する文字列は、REST 動詞、content-md5 値、content-type 値、expires パラメータ値、正規化された x-amz ヘッダー (以下のレシピを参照)、およびリソースを追加することによって形成されます。すべて改行で区切られています。

http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

「REST 動詞」 ( GETvsHEADなど) は、生成する署名と作成する要求の間で一貫している必要があるため、有効な署名は有効でGETはなくHEAD、その逆も同様です。

この方法でファイルを検証するにHEADは、リクエストではなくリクエストに署名する必要があります。GET

于 2013-09-07T22:51:08.020 に答える