CORS: Пользовательский заголовок выходит из строя, даже если соответствующие заголовки Access-Control-Allow-Headers включают в ответ сервера [duplicate]

Добро пожаловать в сообщество XML.

Вам нужно будет найти и использовать проверочный синтаксический анализатор для вашего XML; если вы хотите использовать веб-браузер, вы можете быть разочарованы. Старые версии Internet Explorer проверяют XML по отношению к DTD по умолчанию; более новые версии (но я считаю, что вы можете настроить их для этого, если вы можете понять, как).

Большинство пользователей, использующих XML, в конечном итоге используют XML-специфические инструменты для проверки. Среди моих фаворитов для проверки правильности командной строки являются

  • xmllint (интерфейс командной строки для libxml2, который является частью проекта Gnome, но также можно использовать вне Gnome)
  • rxp (Ричард Тобин из Эдинбургского университета)
  • Xerces J, Xerces C (это проекты Apache)

Существуют также редакторы, поддерживающие XML, которые предлагают интегрированные валидация из редактора (иногда из вашего выбора нескольких парсеров).

4
задан sideshowbarker 29 August 2017 в 03:36
поделиться

1 ответ

Две основные вещи, которые вам нужно изменить / добавить:

  • Используйте Header always set вместо просто Header set
  • Используйте mod_rewrite , чтобы обработать OPTIONS, просто отправив обратно 200 OK с этими заголовками

Итак, чтобы включить запрос в вопросе, вот минимальный фрагмент (ish) config:

Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Headers "Authorization"
Header always set Access-Control-Allow-Methods "GET, OPTIONS"
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
Header always set Access-Control-Max-Age "600"

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

Дальнейшее объяснение в https://benjaminhorn.io/code/setting-cors-cross-origin-resource-sharing-on-apache-with-correct-response-headers-allowing -все-через /

Некоторые общие замечания о том, какие значения задавать для различных заголовков ответа Access-Control-:

  • Access-Control-Allow-Headers: вы должны установить он включает любые имена заголовков, которые ваш запрос отправляет , кроме Имена заголовков CORS-safelisted или так называемые «запрещенные» имена заголовков (имена наборов заголовков браузером, который вы не можете установить в своем JavaScript); spec альтернативно позволяет * wildcard в качестве его значения, поэтому вы можете попробовать его когда-нибудь, но браузер еще не поддерживает его: Хром-ошибка , Ошибка Firefox , Ошибка Safari
  • Access-Control-Allow-Methods: спецификация альтернативно разрешает групповой символ * , но снова , как и в Access-Control-Allow-Headers: *, браузеры еще не поддерживают его
  • Access-Control-Expose-Headers: вы должны включить любые заголовки ответов, которые ваш код клиента должен читать за пределами Cache-Control, Content-Language, Content-Type, Expires, Last-Modified и Pragma, которые выставлены по умолчанию (многие люди забывают установить это и в конечном итоге сбиты с толку, почему они не могут прочитать значение конкретного заголовка ответа); снова спецификация альтернативно допускает * wildcard здесь, но браузеры еще не поддерживают ее
  • Access-Control-Max-Age: Chrome имеет верхний предел 600 (10 минут) hardcoded , поэтому нет смысла устанавливать для него более высокое значение, чем это (Firefox может его уважать, но Chrome будет просто отключать его до 10 минут, если вы установите его выше, а Safari ограничивает его только 5 минут)

Итак, о конкретном запросе, указанном в вопросе, вот некоторые конкретные примечания:

  • Ваш запрос имеет Access-Control-Request-Headers:authorization, поэтому в вашем конфиге Apache добавьте Authorization в заголовок ответа Access-Control-Allow-Headers тоже.
  • Origin - это имя запрещенного заголовка, установленное браузером, а Accept - имя заголовка CORS-safelisted, поэтому вам не нужно включать их в Access-Control-Allow-Headers
  • . Ваш запрос не отправляет Content-Type, поэтому он не нужен в Access-Control-Allow-Headers в ответе (и никогда не требовалось для запросов GET и в противном случае требовалось только, если тип отличается от application/x-www-form-urlencoded, text/plain или multipart/form-data)
  • Для Access-Control-Allow-Methods, ваш запрос кажется просто GET, поэтому, если вы не планируете также делать запросы POST / PUT / DELETE / PATCH, не указывать явно их включение
6
ответ дан sideshowbarker 15 August 2018 в 17:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: