Warum ist meine Cross-Domain-POST-Anfrage Preflight wird mit einem OPTIONS anfordern?
Frage
Nach dem Mozilla Developer Center HTTP Zugriffskontrolle Artikel, Cross-Site-POST Anfragen können „einfache“ sein - das heißt erfordern keine Preflighting -., wenn die Content-Type Anforderung application/x-www-form-urlencoded
ist
ich dieses Verhalten in Firefox nicht immer, und ich verstehe überhaupt nicht, warum das so ist. Hier ist mein Setup-Code:
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);
}
}
}
Und hier ist der Server mich anzusprechen:
// thanks to http://saltybeagle.com/cors/ for having this demo endpoint:
var URL = "http://ucommbieber.unl.edu/CORS/cors.php";
Wenn ich nun eine einfache POST-Anforderung zu tun - mit Daten als application/x-www-form-urlencoded
im Code gesendet oben - Antrag in Firefox Preflight mit einem OPTIONS anfordern. Es ist nicht in Chrome Preflight. Öffnen Sie Fiddler vor diesem Rennen für sich selbst zu sehen:
makeXDomainRequest(URL, "POST", "name=foobar");
// alerts "Response! Hello CORS [...] You sent a POST request. Your name is foobar"
Hier ist die Preflight-OPTIONS-Anforderung in Fiddler (Bekanntmachung des Access-Control-Request-Method: POST
Header, obwohl ich einen vermeintlich sicheren Content-Type und keine benutzerdefinierten Header angegeben):
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
Was ist los? Ist das ein Bug in Firefox, oder bin ich etwas falsch? Dank!
Lösung
Es in der Tat erwies sich als Firefox Bug zu sein. Es endete immer für FF4b6 behoben: https://bugzilla.mozilla.org/show_bug.cgi ? id = 588920