Как я могу узнать, какие заголовки доступа-контроля-разрешить CORS?

Учитывая эти заголовки запроса:

Host: api.example.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:41.0) Gecko/20100101 Firefox/41.0
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
DNT: 1
Origin: https://web.example.org
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

И эти заголовки ответов:

Connection: keep-alive
Content-Length: 0
Content-Type: text/plain; charset=utf-8
Date: Tue, 13 Oct 2015 10:57:34 GMT
Server: nginx/1.8.0
access-control-allow-headers: Authorization, Content-Type
access-control-allow-methods: PUT, DELETE, PATCH
access-control-allow-origin: *

Это работает, хотя явно разрешены только заголовки Authorization и Content-Type. Почему я не должен разрешать другим заголовкам, которые посылает мой браузер? (например, DNT)


Обновить: эта страница MDN содержит обзор простых заголовков (заголовков заголовков по умолчанию CORS-safelisted):

Простой заголовок (или заголовок запроса CORS-safelisted) является одним из следующие заголовки HTTP:

  • Принять
  • Accept-Language
  • Content-Language
  • Content-Type с типом MIME его анализируемого значения (игнорируя параметры) любого приложения /x -www-form-urlencoded, multipart/form-data или text/plain.

Или один из этих заголовков подсказок клиента:

  • DPR
  • Downlink
  • Save-данные
  • ВЭкран-Ширин
  • Ширина

Ответ 1

Не видя ваш код для генерации заголовков или системы, из которой вы обслуживаете, например, nginx или apache, лучшее, что я могу сделать, это отослать вас на http://client.cors-api.appspot.com/client, который позволит вам проверить ваши запросы CORS. Кроме того, вы должны посмотреть на http://enable-cors.org/server.html для вашей конкретной настройки. Например, на nginx вы можете получить что-то вроде этого

add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

Существует набор обычных заголовков, а затем набор заголовков, которые вы должны явно вызвать. см. http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server о настройке на сервере.

Ответ 2

Access-Control-Allow-Headers прикрепляется с помощью backend, вы не можете управлять этим заголовком на стороне клиента. Access-Control-Allow-Headers должен быть возвращен в объекте ответа.

Итак, чтобы включить другие заголовки в заголовок Access-Control-Allow-Headers в объекте ответа - вам нужно настроить свой веб-сервер или обновить бэкэнд-приложение, которое обслуживает запросы, чтобы прикрепить к каждому запросу желаемое значение Access-Control-Allow-Headers.

Чтобы разрешить любые заголовки в запросах клиента, сервер должен добавить заголовок Access-Control-Allow-Origin: * для каждого ответа.

Есть много статей и информации о том, как вы можете настроить CORS на работу так, как вы хотите. Например, один - Включение CORS