Access-Control-Allow-Origin Домены нескольких источников? - PullRequest
946 голосов
/ 31 октября 2009

Можно ли разрешить использование нескольких междоменных доменов с использованием заголовка Access-Control-Allow-Origin?

Я знаю о *, но он слишком открыт. Я действительно хочу разрешить только пару доменов.

Например, что-то вроде этого:

Access-Control-Allow-Origin: http://domain1.example, http://domain2.example

Я пробовал приведенный выше код, но, похоже, он не работает в Firefox.

Можно ли указать несколько доменов или я застрял только на одном?

Ответы [ 28 ]

1 голос
/ 20 июля 2018

Более гибкий подход заключается в использовании выражений Apache 2.4. Вы можете сопоставить домены, пути и практически все остальные переменные запроса. Хотя для всех * ответ, единственными, кто его получил, являются те, которые в любом случае отвечают требованиям.

<IfModule mod_headers.c>
    <If "%{HTTP:Host} =~ /\\bcdndomain\\.example$/i && %{HTTP:Origin} =~ /\\bmaindomain\\.example$/i">
        Header set Access-Control-Allow-Origin "*"
    </If>
</IfModule>
1 голос
/ 12 ноября 2016

Чтобы облегчить многодоменный доступ для службы ASMX, я создал эту функцию в файле global.asax:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string CORSServices = "/account.asmx|/account2.asmx";
    if (CORSServices.IndexOf(HttpContext.Current.Request.Url.AbsolutePath) > -1)
    {
        string allowedDomains = "http://xxx.yyy.example|http://aaa.bbb.example";

        if(allowedDomains.IndexOf(HttpContext.Current.Request.Headers["Origin"]) > -1)
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", HttpContext.Current.Request.Headers["Origin"]);

        if(HttpContext.Current.Request.HttpMethod == "OPTIONS")
            HttpContext.Current.Response.End();
    }
}

Это позволяет также обрабатывать CORS для OPTIONS глагола.

1 голос
/ 28 сентября 2016

И еще один ответ в Джанго. Чтобы иметь одно представление, разрешающее CORS из нескольких доменов, вот мой код:

def my_view(request):
    if 'HTTP_ORIGIN' in request.META.keys() and request.META['HTTP_ORIGIN'] in ['http://allowed-unsecure-domain.com', 'https://allowed-secure-domain.com', ...]:
        response = my_view_response() # Create your desired response data: JsonResponse, HttpResponse...
        # Then add CORS headers for access from delivery
        response["Access-Control-Allow-Origin"] = request.META['HTTP_ORIGIN']
        response["Access-Control-Allow-Methods"] = "GET" # "GET, POST, PUT, DELETE, OPTIONS, HEAD"
        response["Access-Control-Max-Age"] = "1000"  
        response["Access-Control-Allow-Headers"] = "*"  
        return response
0 голосов
/ 15 марта 2019

Ниже ответ специфичен для C #, но концепция должна быть применима ко всем различным платформам.

Чтобы разрешить запросы Cross Origin из веб-API, необходимо разрешить запросы Option к вашему Приложению и добавить примечание ниже на уровне контроллера.

[EnableCors (UrlString, заголовок, метод)] Теперь в начало координат можно передавать только строку s. Поэтому, если вы хотите передать более одного URL-адреса в запросе, передайте его как разделенное запятыми значение.

UrlString = "https://a.hello.com,https://b.hello.com"

0 голосов
/ 18 октября 2013

Ответ службы поддержки Google на показ объявлений по SSL и грамматику в самом RFC могут указывать на то, что вы можете разделять пробелы URL-адресами. Не уверен, насколько хорошо это поддерживается в разных браузерах.

0 голосов
/ 03 февраля 2017

Если вы попробуете так много примеров кода, как я, чтобы заставить его работать с использованием CORS, стоит упомянуть, что вы должны сначала очистить кеш, чтобы попытаться проверить, действительно ли он работает, подобно проблемам, когда старые изображения все еще присутствуют, даже если он удален на сервере (потому что он все еще сохраняется в вашем кэше).

Например, CTRL + SHIFT + DEL в Google Chrome, чтобы удалить кэш.

Это помогло мне использовать этот код после того, как я попробовал много чистых .htaccess решений, и это казалось единственным работающим (по крайней мере для меня):

    Header add Access-Control-Allow-Origin "http://google.com"
    Header add Access-Control-Allow-Headers "authorization, origin, user-token, x-requested-with, content-type"
    Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

    <FilesMatch "\.(ttf|otf|eot|woff)$">
        <IfModule mod_headers.c>
            SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.com|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0
            Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
        </IfModule>
    </FilesMatch>

Также обратите внимание, что широко распространено, что многие решения говорят, что вам нужно набрать Header set ..., но это Header add .... Надеюсь, что это поможет кому-то, кто испытывает те же проблемы в течение нескольких часов, как я.

0 голосов
/ 06 ноября 2010

Ответ, похоже, заключается в использовании заголовка более одного раза. То есть вместо отправки

Access-Control-Allow-Origin: http://domain1.example, http://domain2.example, http://domain3.example

отправить * * 1004

Access-Control-Allow-Origin: http://domain1.example
Access-Control-Allow-Origin: http://domain2.example
Access-Control-Allow-Origin: http://domain3.example

В Apache вы можете сделать это в секции httpd.conf <VirtualHost> или .htaccess, используя mod_headers и следующий синтаксис:

Header add Access-Control-Allow-Origin "http://domain1.example"
Header add Access-Control-Allow-Origin "http://domain2.example"
Header add Access-Control-Allow-Origin "http://domain3.example"

Хитрость заключается в том, чтобы использовать add вместо append в качестве первого аргумента.

0 голосов
/ 31 марта 2015

Мы также можем установить это в файле Global.asax для приложения Asp.net.

protected void Application_BeginRequest(object sender, EventArgs e)
    {

    // enable CORS
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "https://www.youtube.com");

    }
...