0

私は XHR が初めてで、単純なユースケースを解決しようとしています。私は、JavaScript がデータを取得する Web サーバーを持っています。ただし、データ自体を提供する代わりに、サーバーは javascript XHR リクエストを別の場所 (Amazon の S3 上のファイルなど) にリダイレクトして、リクエストを実行します。

これが私をクロスドメイン XHR の世界に導きました。それについて少し読んでも、単純な例でさえ機能することができません。JavaScript を含む Web ページを提供するメイン ドメインのヘッダーに「Access-Control-Allow-Origin: *」を追加しています。しかし、うまくいきません。私は何が欠けていますか?これはブラウザに関係なく機能する必要があるため、最初のサーバーがプロキシとして機能する以外にできることを探しています。これにより、リクエストを S3 にオフロードするという目的が無効になります。

  • Chrome : 2 回目の呼び出しで「Exception: NetworkError: DOM Exception 19」が発生します。
  • IE : 警告を表示しますが、確認後に 2 番目の URL を開きます。
  • Firefox : 2 回目の呼び出しで「Exception: Faliure」とだけ表示されます。

test.php のコードは次のとおりです。

<?php
    header('Content-type: text/html');
    header('Access-Control-Allow-Origin: *');
?>
<!DOCTYPE html>
<html>
<header>
    <script type="text/javascript">
        var request;
        var url1 = "data/file.csv";
        var url2 = "http://stackoverflow.com/users/1293955/ng-algo";

        try
        {
            if (window.XMLHttpRequest) {
                // IE7+, Firefox, Chrome, Opera, Safari
                request = new XMLHttpRequest();
            }
            else {
                // code for IE6, IE5
                 request = new ActiveXObject('Microsoft.XMLHTTP');
            }
            // load data. 'false' indicates that further script
            // is not executed until data is loaded and parsed
            alert("Test1 with url: "+url1);
            request.open('GET', url1, false);
            request.send();
            alert(request.responseText);

            alert("Test2 with url: "+url2);
            request.open('GET', url2, false);
            request.send();
            alert(request.responseText);
        } catch (e) { alert("Exception: "+e.message); }

    </script>
</header>
This is a test page
</html>
4

1 に答える 1

1

任意のリクエストの場合 (質問で Amazon と Stack Overflow が混在している場合)、実際にはリモート サーバーが許可を与える必要があるため、CORS では不十分な場合があります。

2 番目のリクエストを成功させるには、ウェブサイトにリクエストを行う許可を与えるstackoverflow.com関連ヘッダーをレスポンスに含める必要があります。Access-Control-Allow-*この場合、それらが応答に含まれるかどうかは完全に Stack Exchange 次第です。

また、Access-Control-Allow-Origin: *応答に含めることで、他の Web サイトがorigin.


必要になるのは、サーバー上の「プロキシ」スクリプトです。Ben Alman から一般化されたソリューションを見つけることができます。

これにより、次のことが可能になります。

request.open('GET', 'proxy.php?url=' + encodeURIComponent(url2), false);
于 2013-08-17T08:38:58.180 に答える