なぜ私のクロスドメインポストリクエストがオプションリクエストで予定されているのですか?
質問
Mozilla Developer Centerによると HTTPアクセス制御 記事、クロスサイトの投稿リクエストは「単純」である可能性があります - つまり、リクエストのコンテンツタイプがある場合、プリフライトは必要ありません application/x-www-form-urlencoded
.
私はFirefoxでこの行動を取得していません、そして、なぜそうなのかをまったく理解していません。これが私のセットアップコードです:
function makeXDomainRequest(url, method, data) {
var req =
typeof XDomainRequest !== "undefined" ?
new XDomainRequest() : new XMLHttpRequest();
req.open(method || "GET", url, true);
if (typeof req.onload !== "undefined") {
req.onload = onResponseLoad;
req.onerror = onRequestError;
} else {
req.onreadystatechange = onRequestStateChange;
}
if (data && typeof req.setRequestHeader === "function") {
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
} else {
// no way to set Content-Type req header in IE's XDomainRequest:
// http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
}
req.send(data || null);
}
function onResponseLoad() {
alert("Response!\n" + this.responseText);
}
function onRequestError(args) {
alert("Error!");
}
function onRequestStateChange() {
if (this.readyState === 4) {
if (this.status === 200) {
onResponseLoad.apply(this);
} else {
onRequestError.apply(this);
}
}
}
そして、これが私がpingしているサーバーです:
// thanks to http://saltybeagle.com/cors/ for having this demo endpoint:
var URL = "http://ucommbieber.unl.edu/CORS/cors.php";
今、私が簡単なPOSTリクエストを行うと、データが送信されています application/x-www-form-urlencoded
上記のコードでは、リクエストはオプションリクエストを使用してFirefoxで予定されています。 Chromeには予定されていません。これを実行する前にフィドラーを開いて自分で確認してください:
makeXDomainRequest(URL, "POST", "name=foobar");
// alerts "Response! Hello CORS [...] You sent a POST request. Your name is foobar"
これがfiddlerのプリフライトオプションリクエストです(注意してください Access-Control-Request-Method: POST
ヘッダーは、おそらく安全なコンテンツタイプとカスタムヘッダーがないと思われますが:
OPTIONS http://ucommbieber.unl.edu/CORS/cors.php HTTP/1.1
Host: ucommbieber.unl.edu
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://localhost
Access-Control-Request-Method: POST
どうしたの?これはFirefoxのバグですか、それとも私は何か間違ったことをしていますか?ありがとう!
解決
それは確かにファイアフォックスのバグであることが判明しました。最終的にFF4B6が修正されました。 https://bugzilla.mozilla.org/show_bug.cgi?id=588920
所属していません StackOverflow