私のアプリケーションでは、1つのサブドメイン(dev.u413.com)にWebサイトがあり、jQueryを使用して別のサブドメイン(api.u413.com)のJSONAPIにajaxリクエストを送信します。 Chrome開発ツールとFirefoxFirebugでリクエストを調べると、リクエストがAccess-Control-Allowed-Origin
によって妨げられているようです。document.domain
を現在のドメインのサフィックスに設定しました:document.domain = 'u413.com';
。
これが私のリクエストです:
$.ajax({
dataType: 'json',
data: { parseAsHtml: true, cli: 'help' },
url: 'http://api.u413.com/',
success: function (response) {
alert(response.Command);
}
});
同じドメインにあるようにajaxリクエストを変更すると、リクエストは成功します。
$.ajax({
dataType: 'json',
crossDomain: false,
data: { parseAsHtml: true, cli: 'help' },
url: 'http://dev.u413.com/',
success: function (response) {
alert(response.Command);
}
});
なぜこれが起こるのですか? 同一生成元ポリシー のガイドラインに従って、document.domain
を両方のサブドメインの共通のサフィックスに設定したので、ブラウザはクロスドメインの問題について文句を言うべきではありません。
現在、アプリはjsonpで動作していますが、上記でリンクしたのと同じOriginポリシーに従って適切なajaxリクエストが動作するはずです。必要がなければ、jsonpは使いたくないです。サブドメイン間で定期的にajaxリクエストを行うことはできませんか?
同一生成元ポリシーは、私が対処しなければならなかった最も苛立たしいブラウザ関連トピックの1つです。同じドメイン上の2台のサーバーが通信できないことは私には愚かです。残念ながら、同一生成元ポリシーは、同じサーバーへの2つの要求でさえ、異なるポートで同一生成元ポリシーの違反と見なします。これは将来のブラウザで良くなると思います:
http://www.html5rocks.com/en/tutorials/file/xhr2/
検索:クロスオリジンリソースシェアリング(CORS)
基本的に、サーバーは「サーバーxyzへのクロスドメインまたはクロスサブドメイン呼び出しを許可しても問題ありません」という応答ヘッダーを設定する必要があります。
すべてのブラウザがこれをサポートするまでにはしばらく時間がかかります(そして、ほとんどのユーザーがとにかくオフになるまで、私はie8をサポートする必要があります)-しかし、少なくともトンネルの終わりには光があります。
他のサブドメインにもdocument.domain = 'u413.com
を追加する必要があります。
サブドメイン間で定期的にajaxリクエストを行うことはできませんか?
これは技術的にはAJAXではありませんが、フォーム送信が正常にクロスドメインになるAJAXリクエストを模倣できます。欠点は、応答にアクセスできないため、ページが次のようになることです。フォームのACTION
URLにリダイレクトされます。
これの代わりに:
jQuery.post('https://www.com',
'offerCode':523153,
'accountNumber':'',
'_item.x':'42',
'_item.y':'21'
});
これを使って:
jQuery('<form action="https://www.com" method="POST">
<input type="text" name="offerCode" value="523153">
<input type="text" name="accountNumber" value="">
<input type="text" name="_item.x" value="42">
<input type="text" name="_item.y" value="21">
</form>').trigger('submit');