1412 Stimmen

Access-Control-Allow-Origin Multiple Origin Domains?

Gibt es eine Möglichkeit, mehrere Cross-Domains zuzulassen, indem man die Access-Control-Allow-Origin Kopfzeile?

Ich bin mir bewusst, dass die * aber sie ist zu offen. Ich möchte wirklich nur ein paar Domänen zulassen.

Ein Beispiel dafür ist Folgendes:

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

Ich habe den obigen Code ausprobiert, aber er scheint in Firefox nicht zu funktionieren.

Ist es möglich, mehrere Domänen anzugeben, oder muss ich mich auf eine beschränken?

3voto

mathius1 Punkte 1371

HTTP_ORIGIN wird nicht von allen Browsern verwendet. Wie sicher ist HTTP_ORIGIN? Bei mir geht er in FF leer aus.
Ich lasse die Websites, denen ich den Zugriff auf meine Website gestatte, eine Website-ID übermitteln, prüfe dann meine DB auf den Datensatz mit dieser ID und erhalte den Wert der Spalte SITE_URL (www.yoursite.com).

header('Access-Control-Allow-Origin: http://'.$row['SITE_URL']);

Selbst wenn die Anfrage über eine gültige Site-ID gesendet wird, muss sie von der Domäne kommen, die in meiner DB mit dieser Site-ID verknüpft ist.

2voto

Derek Wade Punkte 637

Um den Zugriff auf mehrere Domänen für einen ASMX-Dienst zu erleichtern, habe ich diese Funktion in der Datei global.asax erstellt:

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();
    }
}

Dies ermöglicht die CORS-Behandlung von OPTIONS Verb auch.

2voto

blak3r Punkte 15398

PHP-Codebeispiel für den Abgleich von Subdomains.

if( preg_match("/http:\/\/(.*?)\.yourdomain.example/", $_SERVER['HTTP_ORIGIN'], $matches )) {
        $theMatch = $matches[0];
        header('Access-Control-Allow-Origin: ' . $theMatch);
}

2voto

Akbarali Punkte 406

Ich habe https://stackoverflow.com/a/7454204/13779574 Dieser Code funktionierte gut, gab aber einen Fehler aus, wenn der Benutzer die Seite betrat. Ich habe dieses Problem mit diesem Code behoben.

if (isset($_SERVER['HTTP_ORIGIN'])) {
   $http_origin = $_SERVER['HTTP_ORIGIN'];
   if ($http_origin == "http://localhost:3000" || $http_origin == "http://api.loc/"){  
      header("Access-Control-Allow-Origin: $http_origin");
   }
}

1voto

Silvain Punkte 399

Und eine weitere Antwort in Django. Um eine einzelne Ansicht CORS aus mehreren Domänen zu ermöglichen, ist hier mein Code:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X