Есть ли способ разрешить несколько кросс-доменов, используя Access-Control-Allow-Origin
заголовок?
Я знаю о *
, но это слишком открыто. Я действительно хочу разрешить только пару доменов.
Как пример, примерно так:
Access-Control-Allow-Origin: http://domain1.example, http://domain2.example
Я пробовал приведенный выше код, но он не работает в Firefox.
Можно ли указать несколько доменов или я застрял только на одном?
.htaccess
http
cors
xmlhttprequest
cross-domain
Томас Дж. Брэдли
источник
источник
Access-Control-Allow-Origin
заголовке не означает, что другие домены не могут вызвать метод на этой конечной точке (например, метод REST API). Это просто означает, что запрещенные источники не могут использовать результат в javascript (браузер гарантирует это). Для ограничения доступа к конечной точке для определенных доменов используйте фильтр запросов на стороне сервера, который, например, возвращает HTTP 401 для запрещенных доменов.Vary: Origin
заголовок, если хотите использовать несколько URL-адресов, см. Fetch.spec.whatwg.org/#cors-protocol-and-http-cachesОтветы:
Похоже, рекомендуемый способ сделать это - заставить ваш сервер читать заголовок Origin с клиента, сравнить его со списком доменов, которые вы хотели бы разрешить, и, если он совпадает, отобразить значение
Origin
заголовка обратно клиенту какAccess-Control-Allow-Origin
заголовок в ответе.С помощью этого
.htaccess
вы можете сделать это так:источник
Другое решение, которое я использую в PHP:
источник
header('Access-Control-Allow-Origin: *')
иногда говорит , что не может использовать джокер , если учетные данные флаг верно - бывает , когда ,header('Access-Control-Allow-Credentials: true')
вероятно. Таким образом, лучше разрешить-Происхождение самого$http_origin
себя, если условия будут выполненыheader("Access-Control-Allow-Origin: " . $http_origin);
чтобы заставить его работатьЭто сработало для меня:
Когда вставлено
.htaccess
, это будет работать наверняка.источник
Header set Access-Control-Allow-Credentials true
чтобы это работало как ответ @GeorgeReferer
вместоOrigin
. ИспользованиеReferer
работает, но проблема в том, что он устанавливает полный URL-адрес обратно,Access-Control-Allow-Origin
я хочу вырезать доменное имяReferer
и назначить егоAccess-Control-Allow-Origin
. Что-то вроде результата этого -echo http://example.com/index.php/ab/cd | cut -d'/' -f1,2,3
в команде bash. Можно ли сделать то же самое в (apache) conf файле? Есть идеи?У меня была такая же проблема с woff-шрифтами, доступ к нескольким поддоменам должен был быть. Чтобы разрешить субдомены, я добавил что-то вроде этого в мой httpd.conf:
Для нескольких доменов вы можете просто изменить регулярное выражение в
SetEnvIf
.источник
(.*\.?example\.org)
дляexample.com
иsub.example.com
.subexample.com
. Вы должны изменить его на:((.*\.)?example\.org)
Вот как вернуть заголовок Origin, если он соответствует вашему домену с Nginx, это полезно, если вы хотите обслуживать шрифт несколькими поддоменами:
источник
.
Интерпретируется ли в example.org любое значение, поскольку это регулярное выражение? В каком случае это по ошибке разрешит использовать пользовательский домен верхнего уровня?"^example\.org$"
потому что вы должны убедиться, что хакер не может проскользнуть через ваше регулярное выражение с помощьюsubdomainexample.org
(использования^
) илиexample.orgevil
(использования$
) илиexamplezorg
(побега\.
)Вот что я сделал для приложения PHP, которое запрашивает AJAX
Если запрашивающий источник разрешен моим сервером, верните
$http_origin
себя в качестве значенияAccess-Control-Allow-Origin
заголовка вместо возврата*
подстановочного знака.источник
Есть один недостаток, о котором вы должны знать: как только вы отправляете исходные файлы на CDN (или любой другой сервер, на котором не разрешены сценарии) или если ваши файлы кэшируются на прокси-сервере, изменение ответа основывается на «Origin» заголовок запроса не будет работать.
источник
Vary: Origin
не поддерживается Akamai , одним из крупнейших CDN в мире ... Более подробная информация доступна также здесьДля нескольких доменов, в вашем
.htaccess
:источник
Header set Vary Origin
было бы хорошим дополнением к этому ответу.AccessControlAllowOrigin=$0$1
наAccessControlAllowOrigin=$0
. В противном случае, это не сработало бы для источников HTTPS.http://example.com
вышло правильно, ноhttps://example.com
вышло так жеhttps://example.coms
, с лишнимs
на конце.Для пользователей Nginx разрешить CORS для нескольких доменов. Мне нравится пример @ marshall, хотя его ответы соответствуют только одному домену. Чтобы сопоставить список доменов и поддоменов, это регулярное выражение облегчает работу со шрифтами:
Это будет отображать только заголовки «Access-Control-Allow-Origin», которые соответствуют данному списку доменов.
источник
Для IIS 7.5+ с установленным модулем URL Rewrite 2.0 см. Этот ответ SO
источник
Вот решение для веб-приложения Java, основанное на ответе yesthatguy.
Я использую Джерси REST 1.x
Сконфигурируйте web.xml, чтобы знать о REST Джерси и CORSResponseFilter
Вот код для CORSResponseFilter
источник
Как упоминалось выше, оно
Access-Control-Allow-Origin
должно быть уникальным иVary
должно быть установлено,Origin
если вы находитесь за CDN (Сеть доставки контента).Соответствующая часть моей конфигурации Nginx:
источник
set $cors
какой-то скрытый смысл, или это просто специфично для вашего conifg? кажется, что его можно опустить вместе со вторымif
Возможно, я ошибаюсь, но, насколько я вижу,
Access-Control-Allow-Origin
имеет"origin-list"
параметр as.По определению это
origin-list
:И из этого я утверждаю, что допускается различное происхождение и должно быть разделено пробелами .
источник
5.1 Access-Control-Allow-Origin Response Header
говорится, что origin-list ограничен: вместо того, чтобы разрешать разделить пробелами список источников, это либо один источник, либо строка «null».Для приложений ExpressJS вы можете использовать:
источник
Я изо всех сил пытался настроить это для домена, работающего по протоколу HTTPS, поэтому я решил поделиться этим решением. Я использовал следующую директиву в моем файле httpd.conf :
Измените
example.com
свое доменное имя. Добавьте это внутри<VirtualHost x.x.x.x:xx>
в ваш файл httpd.conf . Обратите внимание, что если у васVirtualHost
есть суффикс порта (например:80
), тогда эта директива не будет применяться к HTTPS, поэтому вам нужно будет также перейти в / etc / apache2 / sites-available / default-ssl и добавить эту же директиву в этот файл внутри из<VirtualHost _default_:443>
раздела.После того, как файлы конфигурации обновлены, вам нужно будет выполнить следующие команды в терминале:
источник
^http(s)?://(.+\.)?example\.com(:\d+)?$
Если у вас проблемы со шрифтами, используйте:
источник
Более гибкий подход заключается в использовании выражений Apache 2.4. Вы можете сопоставить домены, пути и практически все остальные переменные запроса. Хотя отправленный ответ всегда
*
, единственные, кто его получает, - те, которые в любом случае отвечают требованиям. ИспользованиеOrigin
(или любого другого) заголовка запроса в выражении заставляет Apache автоматически объединить его сVary
заголовком ответа, чтобы ответ не использовался повторно для другого источника.источник
*
учетные данные, такие как Логин. Так что будет лучше, если вы передадите соответствующее имя хоста вместо*
.Access-Control-Allow-Origin
заголовок дляOPTIONS
предварительного запроса, который проверяет заголовки, чтобы увидеть, позволяет ли сервер это происхождение. Я исправил это. Так что*
не было настоящей проблемой для меня. Но, тем не менее, некоторые браузеры не принимают*
учетные данные, поэтому, когда веб-приложение отправляет запрос Cross-Origin, они ДОЛЖНЫ указыватьHTTP_ORIGIN
заголовок, к которому вы можете получить динамический доступ с помощью переменнойOrigin
в.htaccess
для Apache, или$_SERVER['HTTP_ORIGIN'];
в PHP. В любом случае, ваше решение хорошо, поскольку оно допускает все источники, но менее безопасно*
позволяет все. 2) ХОСТ отличается от ORIGIN. HOST - это фактический TARGET HOST, который передается в заголовок запроса. Но ORIGIN - этоINITIAL HOST
тот, который отправляет запрос вTARGET HOST
. Поэтому в вашем кодеORIGIN HOST
игнорируется и никогда не используется. Посмотрите ответы выше, и вы увидите, как они используютORIGIN
значения, чтобы добавить их вAccess-Control-Allow-Origin
.*
Не позволяет всем, потому что использованиеOrigin
заголовка запроса в выражении заставляет Apache автоматически объединить его сVary
заголовком ответа, если не используетсяreq_novary('Origin')
(вероятно, нежелательно). Браузеры знают, что они могут получить другой ответ для другого,Origin
и если отправленное значение не проходит тест,Access-Control-Allow-Origin
заголовок никогда не устанавливается.PHP-код:
источник
HTTP_ORIGIN используется не всеми браузерами. Насколько безопасен HTTP_ORIGIN? Для меня это выглядит пустым в FF.
У меня есть сайты, которым я разрешаю доступ к своему сайту, отправляю по идентификатору сайта, затем я проверяю свою базу данных на запись с этим идентификатором и получаю значение столбца SITE_URL (www.yoursite.com).
Даже если отправка через действительный идентификатор сайта, запрос должен быть от домена, указанного в моей БД, связанной с этим идентификатором сайта.
источник
Вот расширенный вариант для Apache, который включает в себя некоторые из последних и запланированных определений шрифтов:
источник
Чтобы облегчить многодоменный доступ для службы ASMX, я создал эту функцию в файле global.asax:
Это также позволяет CORS обрабатывать
OPTIONS
глагол.источник
Пример кода PHP для сопоставления поддоменов.
источник
Для довольно простого копирования / вставки для приложений .NET я написал это, чтобы включить CORS изнутри
global.asax
файла. Этот код следует советам, данным в принятом в настоящее время ответе, отражая происхождение, указанное в запросе в ответе. Это эффективно достигает «*» без его использования.Причина этого заключается в том, что он включает несколько других функций CORS , включая возможность отправки AJAX XMLHttpRequest с атрибутом withCredentials, установленным в значение true.
источник
И еще один ответ в Джанго. Чтобы иметь одно представление, разрешающее CORS из нескольких доменов, вот мой код:
источник
AWS Lambda / API Gateway
Для получения информации о том, как настроить множественные источники на AWS Lambda и API Gateway без сервера - хотя довольно большое решение для чего-то, что можно было бы считать довольно простым - смотрите здесь:
https://stackoverflow.com/a/41708323/1624933
В настоящее время невозможно настроить несколько источников в шлюзе API, см. Здесь: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html ), но рекомендации (в ответ выше) это:
Простое решение, очевидно, включает ALL (*) следующим образом:
Но может быть лучше сделать это на стороне шлюза API (см. 2-ю ссылку выше).
источник
Access-Control-Allow-Credentials: true
не допускается с подстановочными знакамиAccess-Control-Allow-Origin: *
. Установите конкретный<origin>
вместо этого.Ответ службы поддержки Google на показ объявлений через SSL и грамматику в самом RFC , похоже, указывает на то, что вы можете разделять пробелы URL-адресами. Не уверен, насколько хорошо это поддерживается в разных браузерах.
источник
origin-list
: tools.ietf.org/html/rfc6454#section-7.1Если вы попробуете так много примеров кода, как я, чтобы заставить его работать с использованием CORS, стоит упомянуть, что вы должны сначала очистить кеш, чтобы попытаться проверить, работает ли он на самом деле, аналогично проблемам, когда старые изображения все еще присутствуют, даже если удаляется на сервере (потому что он все еще сохраняется в вашем кэше).
Например CTRL + SHIFT + DELв Google Chrome удалить свой кеш.
Это помогло мне использовать этот код после того, как я попробовал много чистых
.htaccess
решений, и это показалось единственным работающим (по крайней мере, для меня):Также обратите внимание, что широко распространено, что многие решения говорят, что вы должны печатать,
Header set ...
но это такHeader add ...
. Надеюсь, что это помогает кому-то, кто испытывает те же проблемы в течение нескольких часов, как я.источник
Ниже ответ специфичен для C #, но концепция должна быть применима ко всем различным платформам.
Чтобы разрешить перекрестные исходные запросы от веб-API, необходимо разрешить запросы Option для своего приложения и добавить примечание ниже на уровне контроллера.
[EnableCors (UrlString, Header, Method)] Теперь происхождение можно передавать только в виде строки. Поэтому, если вы хотите передать более одного URL-адреса в запросе, передайте его как разделенное запятыми значение.
UrlString = " https: //a.hello.com,https: //b.hello.com "
источник
Для заголовка Access-Control-Allow-Origin можно указать только один источник. Но вы можете установить источник в вашем ответе в соответствии с запросом. Также не забудьте установить заголовок Vary. В PHP я бы сделал следующее:
источник
Мы также можем установить это в файле Global.asax для приложения Asp.net.
источник