Тук се случват много различни неща, така че ще отговоря едно по едно.
Chrome и Safari са базирани на WebKit, поради което виждате същото поведение в тези браузъри (Chrome скоро ще премине към Blink, но това все още не е в ръцете на потребителите).
Последната спецификация на CORS гласи, че Accept
е проста заглавка на заявка. Origin
не е включен в списъка с прости заглавки на заявки, но би било глупаво да не се поддържа, тъй като е основата на CORS. Така че технически Firefox прави правилното нещо.
Обърнете внимание обаче, че въпреки че Chrome/Safari включва заглавките Accept
и Origin
, те не проверяват дали тези заглавки са включени в заглавката на отговора Access-Control-Allow-Headers
. Можете да проверите това, като посетите следната връзка:
http://client.cors-api.appspot.com/client#?client_method=PUT&client_credentials=false&client_headers=Accept%3A%20%2A%2F%2A&server_enable=true&server_status=200&server_credentials=false&server_methods=PUT&server_tabs=local
Имайте предвид, че заявката за предполет има заглавка Access-Control-Request-Headers: accept, origin
, но няма Access-Control-Allow-Headers
в отговора. И действителната заявка на CORS все още е успешна.
Заглавието Content-Type
се счита за просто заглавие на заявка само когато стойността му е едно от следните: application/x-www-form-urlencoded
, multipart/form-data
или text/plain
. Всички други стойности ще задействат предполет. Вероятно това е, което виждате тук.
Нямам представа защо браузърите се държат по този начин. Може да е нещо, което си струва да попитате в таблата за съобщения на WebKit или Firefox. Ето кода, където WebKit задава заглавката Access-Control-Request-Headers
:
https://trac.webkit.org/browser/trunk/Source/WebCore/loader/CrossOriginAccessControl.cpp?order=name#L117
Изглежда, че изброява всички заглавки, без да премахва простите заглавки. Предполагам, че има код от страната на отговора, който очаква само непрости заглавки в отговора Access-Control-Allow-Headers
.
person
monsur
schedule
27.06.2013