2013-06-26 3 views
3

Я пытаюсь отправить запрос на перекрестный поиск. Что касается Access-Control-Request-Headers, то я получаю другое поведение в FireFox, Chrome и Safari.Почему нестандартные заголовки включены в заголовки Access-Control-Request?

Chrome :- Access-Control-Request-Headers: origin, content-type, accept 
Safari :- Access-Control-Request-Headers: origin, content-type, accept 
Firefox:- Access-Control-Request-Headers: content-type 

Мои вопросы: -

  1. Как браузеры решить, какие заголовки будут частью Access-Control-Request-Headers?
  2. Насколько я знаю, в Access-Control-Request-Headers должны быть только пользовательские заголовки, но все три (accept, origin и content-type) не являются настраиваемыми заголовками. Тогда почему они являются частью Access-Control-Request-Headers?
  3. Почему поведение зависит от браузера?

ответ

9

Здесь происходит много разных вещей, поэтому я отвечу им по одному за раз.

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.

+0

спасибо @monsur, ваш ответ был действительно полезен :-) – maneet

+0

привет еще одна вещь, использующая хром, я устанавливаю значение заголовка dauth. но в fiddler он показывает мне Access-Control-Request-Headers: content-type, dauth, x-akamai-acs-action. Принимая во внимание, что если i -disbale-web-security для chrome показывает мне значение DAUTH: XXXXXXX .... любая идея, почему она не добавляет значение заголовка в предыдущем случае – Taran

Смежные вопросы