На основании DaveRandom в ответе , я также играл вокруг и нашел несколько более простое решение Apache , который производит один и тот же результат ( Access-Control-Allow-Origin
устанавливаются на текущий конкретный протокол + домен + порт динамически) без использования каких - либо правил перезаписи:
SetEnvIf Origin ^(https?://.+\.mywebsite\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN
Header merge Vary "Origin"
И это все.
Те, кто хочет включить CORS в родительском домене (например, mywebsite.com) в дополнение ко всем его поддоменам, могут просто заменить регулярное выражение в первой строке следующим:
^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$
,
Примечание. Для соответствия спецификациям и правильного поведения кэширования ВСЕГДА добавляйте Vary: Origin
заголовок ответа для ресурсов с поддержкой CORS, даже для запросов не-CORS и запросов из недопустимого источника (см. Пример почему ).
//
в этом контексте нет необходимости избегать , поскольку в Apache conf не используются регулярные выражения, разделенные косой чертой. Regexr жалуется, потому что в этом контексте косые черты имеют особое значение в качестве разделителей.The 'Access-Control-Allow-Origin' header contains multiple values '^(https?://(?:.+.)?aerofotea.com(?::d{1,5})?)$', but only one is allowed. Origin 'http://local.aerofotea.com' is therefore not allowed access.
Спецификация CORS "все или ничего". Он поддерживает только
*
,null
или точный протокол + домен + порт: http://www.w3.org/TR/cors/#access-control-allow-origin-response-headerВашему серверу потребуется проверить заголовок источника с помощью регулярного выражения, а затем вы можете отобразить значение источника в заголовке ответа Access-Control-Allow-Origin.
источник
РЕДАКТИРОВАТЬ : Используйте решение @ Noyo вместо этого. Это проще, понятнее и, вероятно, намного эффективнее под нагрузкой.
ОРИГИНАЛЬНЫЙ ОТВЕТ ОСТАЕТСЯ ТОЛЬКО ДЛЯ ИСТОРИЧЕСКИХ ЦЕЛЕЙ !!
Я немного поэкспериментировал с этой проблемой и придумал это повторно используемое решение .htaccess (или httpd.conf), которое работает с Apache:
Просто установите
ACCESS_CONTROL_ROOT
переменную в верхней части блока для вашего корневого домена, и она будетOrigin:
возвращать клиентуAccess-Control-Allow-Origin:
значение заголовка запроса в значении заголовка ответа, если оно соответствует вашему домену.Также обратите внимание, что вы можете использовать
sub.mydomain.com
какACCESS_CONTROL_ROOT
и он ограничит происхождение доsub.mydomain.com
и*.sub.mydomain.com
(то есть он не должен быть корневым доменом). Элементами, которым разрешено варьироваться (протокол, порт), можно управлять, изменяя URI-совпадающую часть регулярного выражения.источник
Я отвечаю на этот вопрос, потому что принятый ответ не может сделать следующее
Например: он не будет отправлять заголовки CORS для http://mywebsite.com, пока работает для http://somedomain.mywebsite.com/
Чтобы включить его для своего сайта, просто поместите свой сайт вместо «mywebsite.com» в приведенной выше конфигурации Apache.
Чтобы разрешить несколько сайтов:
Тестирование после развертывания:
Следующий ответ скручивания должен иметь заголовок «Access-Control-Allow-Origin» после изменения.
источник
Мне нужно было решение только для PHP, так что на всякий случай оно тоже кому-то нужно. Он принимает допустимую строку ввода, например "* .example.com", и возвращает имя сервера заголовка запроса, если ввод совпадает.
А вот тестовые примеры для провайдера данных phpunit:
источник
preg_quote()
потому что это правильный способ сделать это (хотя.
это единственный метасимвол regexp, допустимый в DNS-имени, онpreg_quote()
лучше описывает предполагаемую операцию)none
не является семантически допустимым значением для заголовка (или, по крайней мере, не делает то, что оно подразумевает) согласно спецификации. Таким образом, этоreturn null;
может иметь больше смысла для этой ветви, и в этом случае заголовок не должен отправляться клиенту, поэтому вызывающий должен проверить его.preg_quote()
будет заключать в кавычки знак *, и поэтому,str_replace()
например, оставляет сиротами "\".При установке
Access-Control-Allow-Origin
в .htaccess работало только следующее:Я попробовал несколько других предлагаемых ключевых слов
Header append
,Header set
, никто не работал , как это предлагается во многих ответах на SO, хотя я понятия не имею , если эти ключевые слова устарели или не действительны для Nginx .Вот мое полное решение:
источник
У нас были похожие проблемы с Font Awesome в статическом домене без файлов cookie при чтении шрифтов из домена cookie (www.domain.tld), и этот пост стал нашим героем. См. Здесь: Как устранить проблему с веб-шрифтом «Отсутствует заголовок ответа общего ресурса (CORS)»?
Для типов copy / paste-r (и для некоторых реквизитов) я собрал это воедино из всех вкладов и добавил в начало файла .htaccess корня сайта:
Супер Безопасный, Супер Элегантный. Вам это нравится: вам не нужно открывать пропускную способность ваших серверов для типов воров / горячих ссылок.
Реквизит: @Noyo @DaveRandom @ pratap-koritala
(Я пытался оставить это как комментарий к принятому ответу, но пока не могу этого сделать)
источник
Для Spring Boot я нашел это,
RegexCorsConfiguration
которое расширяет официальныйCorsConfiguration
: https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.javaисточник
Похоже, что оригинальный ответ был для предварительно Apache 2.4. Это не сработало для меня. Вот что я должен был изменить, чтобы он работал в 2.4. Это будет работать для любой глубины субдомена yourcompany.com .
источник
Мне пришлось немного изменить ответ Ларса , поскольку осиротевший
\
оказался в регулярном выражении, чтобы сравнить только фактический хост (не обращая внимания на протокол или порт), и я хотел поддерживатьlocalhost
домен помимо моего рабочего домена. Таким образом, я изменил$allowed
параметр на массив.Использование следующим образом:
источник
в моем случае используется угловая
в моем HTTP-перехватчике я установил
в шапке запроса
источник