1381 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?

61voto

eyecatchUp Punkte 9094

Für ExpressJS-Anwendungen können Sie verwenden:

app.use((req, res, next) => {
    const corsWhitelist = [
        'https://domain1.example',
        'https://domain2.example',
        'https://domain3.example'
    ];
    if (corsWhitelist.indexOf(req.headers.origin) !== -1) {
        res.header('Access-Control-Allow-Origin', req.headers.origin);
        res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
    }

    next();
});

39voto

Rakib Punkte 10994

Hier ist, was ich für eine PHP-Anwendung, die von AJAX angefordert wird, getan habe

$request_headers        = apache_request_headers();
$http_origin            = $request_headers['Origin'];
$allowed_http_origins   = array(
                            "http://myDumbDomain.example"   ,
                            "http://anotherDumbDomain.example"  ,
                            "http://localhost"  ,
                          );
if (in_array($http_origin, $allowed_http_origins)){  
    @header("Access-Control-Allow-Origin: " . $http_origin);
}

Wenn die anfragende Herkunft von meinem Server zugelassen wird, geben Sie die $http_origin selbst als Wert der Access-Control-Allow-Origin Kopfzeile statt der Rückgabe einer * Platzhalter.

27voto

hernvnc Punkte 607

Wie oben erwähnt, Access-Control-Allow-Origin sollte einzigartig sein und Vary sollte eingestellt werden auf Origin wenn Sie hinter einem CDN (Content Delivery Network) stehen.

Relevanter Teil meiner Nginx-Konfiguration:

if ($http_origin ~* (https?://.*\.mydomain.example(:[0-9]+)?)) {
  set $cors "true";
}
if ($cors = "true") {
  add_header 'Access-Control-Allow-Origin' "$http_origin";
  add_header 'X-Frame-Options' "ALLOW FROM $http_origin";
  add_header 'Access-Control-Allow-Credentials' 'true';
  add_header 'Vary' 'Origin';
}

25voto

Mark Punkte 257

Es gibt einen Nachteil, dessen Sie sich bewusst sein sollten: Sobald Sie Dateien an ein CDN (oder einen anderen Server, der keine Skripte zulässt) auslagern oder wenn Ihre Dateien auf einem Proxy zwischengespeichert werden, funktioniert die Änderung der Antwort auf der Grundlage des "Origin"-Anfrage-Headers nicht mehr.

25voto

Adriano Rosa Punkte 7413

Für Nginx-Benutzer, um CORS für mehrere Domains zu erlauben. Ich mag das Beispiel von @marshall, obwohl seine Antwort nur auf eine Domain passt. Um eine Liste von Domains und Subdomains abzugleichen, macht es diese Regex einfach, mit Schriften zu arbeiten:

location ~* \.(?:ttf|ttc|otf|eot|woff|woff2)$ {
   if ( $http_origin ~* (https?://(.+\.)?(domain1|domain2|domain3)\.(?:me|co|com)$) ) {
      add_header "Access-Control-Allow-Origin" "$http_origin";
   }
}

Damit werden nur "Access-Control-Allow-Origin"-Kopfzeilen ausgegeben, die mit der angegebenen Liste von Domänen übereinstimmen.

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