Заголовки HTTP, вызывающие PREFLIGHT — разъяснение?

Простые запросы — это запросы, отвечающие следующим критериям:

  • Метод HTTP соответствует (с учетом регистра) одному из:

    • HEAD
    • ПОЛУЧИТЬ
    • ПОЧТА
  • Соответствия заголовков HTTP (без учета регистра):

    • Accept
    • Accept-Language
    • Язык содержания
    • Идентификатор последнего события
    • Content-Type, but only if the value is one of:
      • application/x-www-form-urlencoded
      • multipart/form-data
      • текст/обычный

Но глядя на эту тестовую страницу, которая не вызывает предварительную проверкузапрос:

Общие:

Remote Address:69.163.243.142:80
Request URL:http://aruner.net/resources/access-control-with-get/
Request Method:GET
Status Code:200 OK

Заголовки запроса

Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,he;q=0.6
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:aruner.net
Origin:http://arunranga.com
Pragma:no-cache
Referer:http://arunranga.com/examples/access-control/simpleXSInvocation.html
User-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36

Заголовки ответа

Access-Control-Allow-Origin:http://arunranga.com
Connection:Keep-Alive
Content-Type:application/xml
Date:Sat, 26 Sep 2015 09:00:26 GMT
Keep-Alive:timeout=2, max=100
Server:Apache
Transfer-Encoding:chunked

Будучи педантичным и взглянув на раздел request , есть много заголовков, которых нет в предыдущем разделе критериев:

  • Cache-Control нет в списке
  • Connection нет в списке
  • DNT нет нет в списке
  • User-Agent нет в списке
  • Accept-Encoding нет в списке

Я знаю, что это больше "общие" заголовки. Но accept-language тоже.

Вопрос

Что мне здесь не хватает? Согласно разделу критериев, запрос с такими заголовками должен вызывать предварительный запрос.


person Royi Namir    schedule 26.09.2015    source источник


Ответы (2)


Глядя на ваш код:

    invocation.open('GET', url, true);
    invocation.onreadystatechange = handler;
    invocation.send(); 

На самом деле вы не устанавливаете никаких пользовательских заголовков. например

    invocation.setRequestHeader("X-Requested-With", "XMLHttpRequest");

Поэтому предполетной подготовки не будет. Заголовки браузера по умолчанию не учитываются. Механизм предварительной проверки предназначен только для того, чтобы гарантировать, что любые пользовательские заголовки, такие как тот, что в моем примере выше, разрешены для междоменной передачи принимающим сайтом.

person SilverlightFox    schedule 26.09.2015

В качестве дополнительного разъяснения в дополнение к принятому ответу: см. разделение уровня заголовка HTTP раздела Fetch Standard (где сегодня определяются требования протокола CORS и UA).

Для получения данных платформа имеет уровень API (HTML img, CSS background-image), уровень ранней выборки, уровень сервисного работника, а также уровень сети и кэша. Accept и Accept-Language устанавливаются на уровне ранней выборки (обычно агентом пользователя). Большинство других заголовков, контролируемых пользовательским агентом, таких как Accept-Encoding, Host и Referer, устанавливаются на уровне сети и кэша. Разработчики могут устанавливать заголовки либо на уровне API, либо на уровне сервисного работника (обычно через объект Request).

Итак, исходя из этого, мы можем по существу сказать:

  • заголовки в вопросе контролируются UA и устанавливаются на «сетевом уровне и уровне кеша».
  • поэтому заголовки не являются заголовками, которые разработчики могут установить на «уровне API».
  • таким образом, заголовки еще не были установлены в тот момент, когда запускается алгоритм для определения того, требуется ли предварительный запрос (вместо этого они устанавливаются ПА позже, после того, как это уже сделано)

Затем, учитывая вышеизложенное, несмотря на то, что эти заголовки можно увидеть в запросе, мы знаем, что они не сыграли никакой роли в определении того, должна ли требоваться предварительная проверка.

Другими словами, эти заголовки по существу не имеют отношения к CORS. Кроме того, единственные релевантные заголовки — это те, которые разработчики вручную установили на «уровне API» или на уровне сервис-воркеров.

person sideshowbarker    schedule 27.09.2015