2

セキュリティで保護されたページから AJAX 要求を送信しようとしていますが、XMLHttpRequest オブジェクトが URL のプロトコル部分を適切に解決しません。この動作は、Safari、Chrome、および Canary で同じです。

これが私のJavaScriptです:

function sendGETRequest(url, params, callback) {
    "use strict";
    var req = new XMLHttpRequest();
    req.onreadystatechange = function () {
        if (req.readyState === 4) {
            if (req.status !== 200) {
                callback({ajaxError: true, status: req.status});
            } else {
                callback(req);
            }
        }
    };
    req.open("GET", url + "?" + params, true);
    req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    req.send();
}

sendGETRequest() に渡されるいくつかの異なる URL とその結果を次に示します。

url = "ajax/";
GET https://mydomain/mypage/ajax/?params 404 (NOT FOUND)

上記は予想される動作です。相対 URL は、プロトコルを変更せずに正しく解決されます。

url = "/ajax/";
The page at https://mydomain/mypage/ displayed insecure content from http://mydomain/ajax/?params.

ここでは、実際の URL がドメイン ルートに正しく追加されていますが、プロトコルが間違っています。

url = "https://mydomain/ajax/";
The page at https://mydomain/mypage/ displayed insecure content from http://mydomain/ajax/?params.

ここでは、プロトコルは単に無視されます。

明確にするために、私は同じオリジン ポリシーを回避しようとしているわけではありません。安全なページから同じ (安全な) オリジンのリソースに AJAX リクエストを送信したいと考えています。この単純なタスクをどのように達成できますか?

4

3 に答える 3

0

これは、HTTP および HTTPS とは関係ありません。コメントで述べたように、同一オリジン ポリシーにより、リクエストが送信されることはありません。リクエストが送信されない場合、リクエストが間違ったポリシーを使用している可能性はありますか? あなたを混乱させているのは、エラーメッセージを生成しているプログラム/アドオン/ツール/その他が「HTTPS」ではなく「HTTP」を表示していることです。HTTPS が設定されている場合、リクエストは常に HTTPS を尊重します。

あなたの本当の問題は、クロスオリジン ポリシーに違反していることです。これを参照してください: https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file:_URIs

ディレクトリ ツリーを上に移動することはできません。下に移動するだけです。最初の例では、サブフォルダーを要求しています。それはいいです。2 番目と 3 番目の例では、親ディレクトリからページを要求しています (つまりhttps://mydomain/mypage/ajax/https://mydomain/ajax/.

インデックス ページをドメインのルートに移動するか、ファイルで送信される同一オリジン ポリシー ヘッダーを変更するか、サーバーのサブ ディレクトリでリクエストを処理するようにします (PHP のincludeのようなものを使用して、親ファイル)。

于 2012-08-14T19:41:12.420 に答える
0

これは WebKit のバグです。Lion の Safari 5 では修正されていますが、Snow Leopard では修正されていません。また、Chrome では修正されていますがCanaryでは修正されていません。

于 2012-08-15T03:17:49.863 に答える
0

このトピックに関する会話がここにあります: http://bytes.com/topic/javascript/answers/459071-ajax-https

最後の投稿の 1 つは、「完全に明確にするために、XML HTTP リクエストは https とまったく同じように https で機能します。もしそうでなければ、QA 部門はほぼ独占的に https でテストするので、今までに何か言っていたでしょう」と述べています。

おそらく、サーバーはリクエストが行われている時点で Https (ssl) を使用していません: mydomain/ajax/.

于 2012-08-14T19:08:43.467 に答える