Gibt es eine Möglichkeit, mehrere domänenübergreifende Funktionen mithilfe des Access-Control-Allow-Origin
Headers zuzulassen ?
Ich bin mir dessen bewusst *
, aber es ist zu offen. Ich möchte wirklich nur ein paar Domains zulassen.
Zum Beispiel so etwas:
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 Domains anzugeben, oder stecke ich nur bei einer fest?
.htaccess
http
cors
xmlhttprequest
cross-domain
Thomas J Bradley
quelle
quelle
Access-Control-Allow-Origin
Header bedeutet nicht , dass andere Domänen keine Methode auf diesem Endpunkt auslösen können (z. B. REST-API-Methode). Dies bedeutet lediglich, dass nicht zugelassene Ursprünge das Ergebnis nicht in Javascript verwenden können (der Browser stellt dies sicher). Verwenden Sie zum Einschränken des Zugriffs auf einen Endpunkt für bestimmte Domänen einen serverseitigen Anforderungsfilter, der z. B. HTTP 401 für nicht zulässige Domänen zurückgibt.Vary: Origin
Header anhängen, wenn Sie mehrere URLs verwenden möchten, siehe: fetch.spec.whatwg.org/#cors-protocol-and-http-cachesAntworten:
Klingt so, als würde empfohlen, dass Ihr Server den Origin-Header vom Client liest, diesen mit der Liste der Domänen vergleicht, die Sie zulassen möchten, und wenn dies übereinstimmt, den Wert des
Origin
Headers an den Client zurücksendet derAccess-Control-Allow-Origin
Header in der Antwort.Mit
.htaccess
können Sie es so machen:quelle
Eine andere Lösung, die ich in PHP verwende:
quelle
header('Access-Control-Allow-Origin: *')
manchmal sagt nicht Platzhalter verwenden können , wenn Anmeldeinformationen Flag wahr ist - passiert , wennheader('Access-Control-Allow-Credentials: true')
wahrscheinlich. Also, besser Allow-Origin das$http_origin
selbst, wenn die Bedingungen erfüllt sindheader("Access-Control-Allow-Origin: " . $http_origin);
, damit es funktioniertDas hat bei mir funktioniert:
Wenn
.htaccess
es eingesetzt wird, wird es sicher funktionieren.quelle
Header set Access-Control-Allow-Credentials true
damit dies wie die Antwort von @George funktioniertReferer
anstelle vonOrigin
. Die VerwendungReferer
funktioniert, aber das Problem ist, dass die vollständige URL auf "Access-Control-Allow-Origin
Ich möchte den Domainnamen ausschneidenReferer
und ihm zuweisen" zurückgesetzt wirdAccess-Control-Allow-Origin
. So etwas wie das Ergebnis davon -echo http://example.com/index.php/ab/cd | cut -d'/' -f1,2,3
in Bash-Befehl. Ist dies in der (apache) conf-Datei möglich? Irgendeine Idee?Ich hatte das gleiche Problem mit Woff-Schriften, mehrere Subdomains mussten Zugriff haben. Um Subdomains zuzulassen, habe ich meiner httpd.conf Folgendes hinzugefügt:
Für mehrere Domains können Sie einfach den regulären Ausdruck in ändern
SetEnvIf
.quelle
(.*\.?example\.org)
fürexample.com
undsub.example.com
.subexample.com
. Sie sollten es ändern in:((.*\.)?example\.org)
Hier erfahren Sie, wie Sie den Origin-Header wiedergeben, wenn er mit Ihrer Domain mit Nginx übereinstimmt. Dies ist nützlich, wenn Sie eine Schriftart für mehrere Subdomains bereitstellen möchten:
quelle
.
in example.org als ein beliebiger Wert interpretiert, da dies ein regulärer Ausdruck ist? In welchem Fall würde dies fälschlicherweise eine benutzerdefinierte TLD für Beispielorganisationen zulassen?"^example\.org$"
weil Sie sicherstellen müssen, dass ein Hacker nicht mitsubdomainexample.org
(Verwendung^
) oderexample.orgevil
(Verwendung$
) oderexamplezorg
(Flucht\.
) durch Ihre Regex schlüpfen kannFolgendes habe ich für eine PHP-Anwendung getan, die von AJAX angefordert wird
Wenn der anfordernde Ursprung von meinem Server zugelassen wird, geben Sie sich
$http_origin
selbst als Wert desAccess-Control-Allow-Origin
Headers zurück, anstatt einen*
Platzhalter zurückzugeben.quelle
Es gibt einen Nachteil, den Sie beachten sollten: Sobald Sie Dateien an ein CDN (oder einen anderen Server, der keine Skripterstellung zulässt) auslagern oder wenn Ihre Dateien auf einem Proxy zwischengespeichert werden, ändern Sie die Antwort basierend auf "Origin". Anforderungsheader funktioniert nicht.
quelle
Vary: Origin
wird nicht von Akamai unterstützt , einem der größten CDNs da draußen ... Weitere Details finden Sie auch hierFür mehrere Domains in Ihrem
.htaccess
:quelle
Header set Vary Origin
wäre eine schöne Ergänzung zu dieser Antwort.AccessControlAllowOrigin=$0$1
zuAccessControlAllowOrigin=$0
. Andernfalls funktionierte es nicht für HTTPS-Ursprünge.http://example.com
kam richtig heraus,https://example.com
kam aber heraushttps://example.coms
, mit einem Extras
am Ende.Für Nginx-Benutzer, CORS für mehrere Domänen zuzulassen. Ich mag das Beispiel von @ marshall, obwohl seine Antworten nur einer Domain entsprechen. Um eine Liste von Domänen und Unterdomänen abzugleichen, erleichtert diese Regex die Arbeit mit Schriftarten:
Dies gibt nur "Access-Control-Allow-Origin" -Header wieder, die mit der angegebenen Liste von Domains übereinstimmen.
quelle
Informationen zu IIS 7.5+ mit installiertem URL Rewrite 2.0-Modul finden Sie in dieser SO-Antwort
quelle
Hier ist eine Lösung für die Java-Web-App, basierend auf der Antwort von yesthatguy.
Ich benutze Jersey REST 1.x.
Konfigurieren Sie die Datei web.xml so, dass Jersey REST und CORSResponseFilter bekannt sind
Hier ist der Code für CORSResponseFilter
quelle
Wie oben erwähnt,
Access-Control-Allow-Origin
sollte eindeutig sein undVary
auf eingestellt werden,Origin
wenn Sie sich hinter einem CDN (Content Delivery Network) befinden.Relevanter Teil meiner Nginx-Konfiguration:
quelle
set $cors
eine versteckte Bedeutung oder ist sie nur spezifisch für Ihr Conifg? es scheint, dass es zusammen mit dem zweitenif
Vielleicht irre ich mich, aber soweit ich sehen kann
Access-Control-Allow-Origin
hat ein"origin-list"
as Parameter.Durch die Definition eines
origin-list
ist:Und daraus argumentiere ich, dass unterschiedliche Ursprünge zugelassen sind und räumlich getrennt sein sollten .
quelle
5.1 Access-Control-Allow-Origin Response Header
besagt , dass herkunfts Liste beschränkt ist: statt zuzulassen , dass eine durch Leerzeichen getrennte Liste von Ursprüngen, es ist entweder ein einzelner Ursprung oder die Zeichenkette „null“.Für ExpressJS-Anwendungen können Sie Folgendes verwenden:
quelle
Ich hatte Mühe, dies für eine Domain einzurichten, auf der HTTPS ausgeführt wird, und dachte mir, ich würde die Lösung gemeinsam nutzen. Ich habe die folgende Anweisung in meiner httpd.conf- Datei verwendet:
Ändern Sie
example.com
Ihren Domainnamen. Fügen Sie dies<VirtualHost x.x.x.x:xx>
in Ihre httpd.conf- Datei ein. Beachten Sie, dass diese Anweisung nicht für HTTPS gilt , wenn SieVirtualHost
ein Port-Suffix haben (z. B.:80
). Sie müssen daher auch zu / etc / apache2 / sites-available / default-ssl gehen und dieselbe Anweisung in diese Datei einfügen des<VirtualHost _default_:443>
Abschnitts.Sobald die Konfigurationsdateien aktualisiert wurden, müssen Sie die folgenden Befehle im Terminal ausführen:
quelle
^http(s)?://(.+\.)?example\.com(:\d+)?$
Wenn Sie Probleme mit Schriftarten haben, verwenden Sie:
quelle
Ein flexiblerer Ansatz ist die Verwendung der Ausdrücke von Apache 2.4. Sie können mit Domänen, Pfaden und nahezu jeder anderen Anforderungsvariablen übereinstimmen. Obwohl die gesendete Antwort immer ist
*
, sind die einzigen Anforderer, die sie erhalten, diejenigen, die die Anforderungen trotzdem erfüllen. Die Verwendung desOrigin
(oder eines anderen) Anforderungsheaders im Ausdruck führt dazu, dass Apache ihn automatisch in denVary
Antwortheader einfügt, sodass die Antwort nicht für einen anderen Ursprung wiederverwendet wird.quelle
*
Anmeldeinformationen wie Login nicht akzeptieren . Es ist also besser, wenn Sie den übereinstimmenden Hostnamen anstelle von übergeben*
.Access-Control-Allow-Origin
Header nicht für eineOPTIONS
Preflight-Anforderung zurückgegeben hat, die nach Headern sucht, um festzustellen , ob der Server diesen Ursprung zulässt. Ich habe es repariert. War also*
nicht das eigentliche Problem für mich. Einige Browser akzeptieren jedoch immer noch keine*
Anmeldeinformationen. Wenn eine Webanwendung eine Cross-Origin-Anforderung sendet, MÜSSEN sie einenHTTP_ORIGIN
Header angeben , auf den Sie möglicherweise dynamisch mit VariablenOrigin
in.htaccess
für Apache oder$_SERVER['HTTP_ORIGIN'];
in PHP zugreifen . Wie auch immer, Ihre Lösung ist gut, da sie alle Ursprünge zulässt, aber weniger sicher*
erlaubt alles. 2) HOST unterscheidet sich von ORIGIN. HOST ist der tatsächliche 'ZIEL-HOST', der an den Anforderungsheader übergeben wird. Aber ORIGIN istINITIAL HOST
derjenige, der die Anfrage an die sendetTARGET HOST
. Daher wird in Ihrem CodeORIGIN HOST
ignoriert und nie verwendet. Sehen Sie sich die Antworten oben an und Sie werden sehen, wie sieORIGIN
Werte verwenden, um sie hinzuzufügenAccess-Control-Allow-Origin
.*
nicht jedem, da die Verwendung desOrigin
Anforderungsheaders im Ausdruck dazu führt, dass Apache ihn automatisch in denVary
Antwortheader zusammenführt, es sei denn, man verwendetreq_novary('Origin')
(wahrscheinlich unerwünscht). Browser wissen, dass sie möglicherweise eine andere Antwort für eine andere erhalten.Origin
Wenn der gesendete Wert den Test nicht besteht, wird derAccess-Control-Allow-Origin
Header nie gesetzt.PHP-Code:
quelle
HTTP_ORIGIN wird nicht von allen Browsern verwendet. Wie sicher ist HTTP_ORIGIN? Für mich ist es in FF leer.
Ich habe die Sites, denen ich den Zugriff auf meine Site erlaube, über eine Site-ID gesendet. Anschließend überprüfe ich meine Datenbank auf den Datensatz mit dieser ID und erhalte den Spaltenwert SITE_URL (www.yoursite.com).
Selbst wenn eine gültige Site-ID gesendet wird, muss die Anforderung von der Domäne stammen, die in meiner mit dieser Site-ID verknüpften Datenbank aufgeführt ist.
quelle
Hier ist eine erweiterte Option für Apache, die einige der neuesten und geplanten Schriftartdefinitionen enthält:
quelle
Um den Zugriff auf mehrere Domänen für einen ASMX-Dienst zu erleichtern, habe ich diese Funktion in der Datei global.asax erstellt:
Dies ermöglicht auch die CORS-Behandlung von
OPTIONS
Verben.quelle
PHP-Codebeispiel für übereinstimmende Subdomains.
quelle
Für ein relativ einfaches Kopieren / Einfügen für .NET-Anwendungen habe ich dies geschrieben, um CORS aus einer
global.asax
Datei heraus zu aktivieren . Dieser Code folgt den Ratschlägen in der aktuell akzeptierten Antwort und spiegelt den Ursprung wider, der in der Anfrage in der Antwort angegeben ist. Dies erreicht effektiv '*', ohne es zu verwenden.Der Grund dafür ist, dass mehrere andere CORS-Funktionen aktiviert werden, einschließlich der Möglichkeit, eine AJAX XMLHttpRequest mit dem Attribut 'withCredentials' auf 'true' zu senden.
quelle
Und noch eine Antwort in Django. Damit eine einzelne Ansicht CORS aus mehreren Domänen zulässt, ist hier mein Code:
quelle
AWS Lambda / API-Gateway
Informationen zum Konfigurieren mehrerer Ursprünge auf Serverless AWS Lambda und API Gateway finden Sie hier: Eine ziemlich umfangreiche Lösung für etwas, das Ihrer Meinung nach recht einfach sein sollte:
https://stackoverflow.com/a/41708323/1624933
Es ist derzeit nicht möglich, mehrere Ursprünge in API Gateway zu konfigurieren, siehe hier: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html ), aber die Empfehlung (in Die Antwort oben lautet:
Die einfache Lösung besteht offensichtlich darin, ALL (*) wie folgt zu aktivieren:
Es ist jedoch möglicherweise besser, dies auf der API-Gateway-Seite zu tun (siehe 2. Link oben).
quelle
Access-Control-Allow-Credentials: true
ist mit Platzhalter nicht erlaubtAccess-Control-Allow-Origin: *
. Stellen Sie<origin>
stattdessen eine bestimmte ein.Die Antwort von Google auf die Schaltung von Anzeigen über SSL und die Grammatik im RFC selbst scheinen darauf hinzudeuten, dass Sie die URLs durch Leerzeichen begrenzen können. Ich bin mir nicht sicher, wie gut dies in verschiedenen Browsern unterstützt wird.
quelle
origin-list
: tools.ietf.org/html/rfc6454#section-7.1Wenn Sie so viele Codebeispiele wie mich ausprobieren, damit es mit CORS funktioniert, müssen Sie zuerst Ihren Cache leeren, um zu versuchen, ob es tatsächlich funktioniert, ähnlich wie bei Problemen, wenn alte Bilder noch vorhanden sind, auch wenn dies der Fall ist auf dem Server gelöscht (weil es noch in Ihrem Cache gespeichert ist).
Zum Beispiel CTRL + SHIFT + DELin Google Chrome, um Ihren Cache zu löschen.
Dies hat mir geholfen, diesen Code zu verwenden, nachdem ich viele reine
.htaccess
Lösungen ausprobiert hatte , und dies schien die einzige zu sein, die funktionierte (zumindest für mich):Beachten Sie auch, dass es weit verbreitet ist, dass viele Lösungen sagen, dass Sie tippen müssen,
Header set ...
aber es istHeader add ...
. Ich hoffe, das hilft jemandem, der seit einigen Stunden die gleichen Probleme hat wie ich.quelle
Die folgende Antwort ist spezifisch für C #, das Konzept sollte jedoch auf alle verschiedenen Plattformen anwendbar sein.
Um Cross Origin-Anforderungen von einer Web-API aus zuzulassen, müssen Sie Optionsanfragen für Ihre Anwendung zulassen und auf Controller-Ebene die folgenden Anmerkungen hinzufügen.
[EnableCors (UrlString, Header, Method)] Jetzt können die Ursprünge nur noch als Zeichenfolge übergeben werden. Wenn Sie also mehr als eine URL in der Anforderung übergeben möchten, übergeben Sie diese als durch Kommas getrennten Wert.
UrlString = " https: //a.hello.com,https: //b.hello.com "
quelle
Für den Header Access-Control-Allow-Origin kann nur ein einziger Ursprung angegeben werden. Sie können den Ursprung in Ihrer Antwort jedoch entsprechend der Anforderung festlegen. Vergessen Sie auch nicht, den Vary-Header festzulegen. In PHP würde ich Folgendes tun:
quelle
Wir können dies auch in der Datei Global.asax für die Asp.net-Anwendung festlegen.
quelle