Здесь происходит много разных вещей, поэтому я отвечу им по одному за раз.
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
.
спасибо @monsur, ваш ответ был действительно полезен :-) – maneet
привет еще одна вещь, использующая хром, я устанавливаю значение заголовка dauth. но в fiddler он показывает мне Access-Control-Request-Headers: content-type, dauth, x-akamai-acs-action. Принимая во внимание, что если i -disbale-web-security для chrome показывает мне значение DAUTH: XXXXXXX .... любая идея, почему она не добавляет значение заголовка в предыдущем случае – Taran