NGINX add_header, добавление нескольких заголовков

21

Я пытаюсь отправить несколько заголовков

add_header Access-Control-Allow-Origin http://dev.anuary.com;
add_header Access-Control-Allow-Origin https://dev.anuary.com;

Однако вместо этого NGINX превращает их в

Access-Control-Allow-Origin: http://dev.anuary.com, https://dev.anuary.com

Какое решение?

Gajus
источник

Ответы:

28

Ну, да, nginx объединяет заголовки с одинаковыми именами ... но делает это в соответствии со спецификацией HTTP. Смотрите раздел 4.2 .

Заголовок:

Access-Control-Allow-Origin: http://dev.anuary.com, https://dev.anuary.com

В соответствии со спецификацией HTTP / 1.1 функционально эквивалентно:

Access-Control-Allow-Origin: http://dev.anuary.com
Access-Control-Allow-Origin: https://dev.anuary.com

Если у вас есть система или приложение, способное читать один формат, а не другой, то это проблема. nginx делает все правильно.


РЕДАКТИРОВАТЬ :

Документация Mozilla гласит, что может быть только один Access-Control-Allow-Originзаголовок.

Форматирование ( см. Здесь ) должно быть разделено пробелами:

add_header Access-Control-Allow-Origin "http://dev.anuary.com https://dev.anuary.com";

Но на самом деле, вы должны повторять Originзаголовок, предоставленный клиентом, а не генерировать его на ровном месте. Это, вероятно, более уместно:

if ($http_origin ~* "^https?://dev\.anuary\.com$" ) {
    add_header Access-Control-Allow-Origin $http_origin;
}
Шейн Мэдден
источник
Ну, последний не работает в FireFox 9 или любой другой версии. Какая проблема.
Гайус,
1
@ Гай И не должен. Смотрите редактировать.
Шейн Мэдден
ПРИМЕЧАНИЕ: если данное решение не работает для вас, прочитайте это и это . Это поучительно, и вы можете найти причину, по которой это не работает.
its_me
Может ли значение Access-Control-Allow-Origin быть регулярным выражением?
haxpanel
Не могли бы вы распространить свой пример на несколько источников (например, http://example.comи http://localhost:3000)?
Августин Ридингер
-1

Я столкнулся с той же проблемой, что и несколько поддоменов в моей сети, пытаясь получить доступ к ресурсам, и он nginxбыл неправильно настроен. Вот как я это исправил.

add_header Access-Control-Allow-Origin https://*.your-domain-name.com;

Надеюсь, это поможет.

Милад Резазаде
источник