Basierend auf der Antwort von DaveRandom habe ich auch herumgespielt und eine etwas einfachere Apache-Lösung gefunden, die das gleiche Ergebnis liefert ( Access-Control-Allow-Origin
wird dynamisch auf das aktuelle spezifische Protokoll + Domäne + Port eingestellt), ohne Umschreiberegeln zu verwenden:
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"
Und das ist es.
Diejenigen, die CORS in der übergeordneten Domain (z. B. mywebsite.com) zusätzlich zu all ihren Subdomains aktivieren möchten, können einfach den regulären Ausdruck in der ersten Zeile durch diesen ersetzen:
^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$
.
Hinweis: Um die Einhaltung der Spezifikationen und das korrekte Caching-Verhalten zu gewährleisten, fügen Sie IMMER den Vary: Origin
Antwortheader für CORS-fähige Ressourcen hinzu, auch für Nicht-CORS-Anforderungen und Anforderungen mit nicht zugelassenem Ursprung (siehe Beispiel warum ).
//
in diesem Zusammenhang keine Notwendigkeit, dem zu entkommen , da die Apache-Konf. keine durch Schrägstriche getrennten regulären Ausdrücke verwendet. Regexr beschwert sich, weil in diesem Zusammenhang die Schrägstriche als Begrenzer eine besondere Bedeutung haben.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.
Die CORS-Spezifikation ist alles oder nichts. Es unterstützt nur
*
,null
oder die genaue Protokoll + domain + port: http://www.w3.org/TR/cors/#access-control-allow-origin-response-headerIhr Server muss den Ursprungsheader mithilfe des regulären Ausdrucks validieren. Anschließend können Sie den Ursprungswert im Antwortheader Access-Control-Allow-Origin wiedergeben.
quelle
BEARBEITEN : Verwenden Sie anstelle dieser Lösung die Lösung von @ Noyo . Es ist einfacher, klarer und unter Last wahrscheinlich viel leistungsfähiger.
ORIGINAL ANTWORT HIER NUR ZU HISTORISCHEN ZWECKEN LINKS !!
Ich habe ein bisschen mit diesem Problem herumgespielt und mir diese wiederverwendbare .htaccess-Lösung (oder httpd.conf) ausgedacht, die mit Apache funktioniert:
Setzen Sie einfach die
ACCESS_CONTROL_ROOT
Variable oben im Block auf Ihre Stammdomäne und sie gibt denOrigin:
Anforderungsheaderwert im Antwortheaderwert an den Client zurück,Access-Control-Allow-Origin:
wenn er mit Ihrer Domäne übereinstimmt.Beachten Sie, dass auch Sie verwenden können ,
sub.mydomain.com
wie dasACCESS_CONTROL_ROOT
und es wird begrenzen Herkunftsub.mydomain.com
und*.sub.mydomain.com
(dh es ist nicht die Domain - Root sein muss). Die Elemente, die variieren dürfen (Protokoll, Port), können durch Ändern des URI-Übereinstimmungsabschnitts der Regex gesteuert werden.quelle
Ich beantworte diese Frage, weil die akzeptierte Antwort nicht folgen kann
Beispiel: Es werden keine CORS-Header für http://mywebsite.com gesendet, während für http://somedomain.mywebsite.com/ gearbeitet wird.
Um Ihre Site zu aktivieren, setzen Sie Ihre Site in der obigen Apache-Konfiguration einfach anstelle von "mywebsite.com" ein.
So erlauben Sie mehrere Sites:
Testen Nach der Bereitstellung:
Die folgende Curl-Antwort sollte nach der Änderung den Header "Access-Control-Allow-Origin" haben.
quelle
Ich brauchte eine reine PHP-Lösung, also nur für den Fall, dass jemand sie auch braucht. Es wird eine zulässige Eingabezeichenfolge wie "* .example.com" verwendet und der Name des Anforderungsheader-Servers zurückgegeben, wenn die Eingabe übereinstimmt.
Und hier sind die Testfälle für einen phpunit-Datenanbieter:
quelle
preg_quote()
da dies der richtige Weg ist (obwohl.
das einzige reguläre Regexp-Metazeichen in einem DNS-Namen gültig ist,preg_quote()
beschreibt es die beabsichtigte Operation besser)none
es sich nicht um einen semantisch gültigen Wert für den Header handelt (oder zumindest nicht das tut, was er impliziert), gemäß der Spezifikation. Daher ist diesreturn null;
für diesen Zweig möglicherweise sinnvoller. In diesem Fall sollte kein Header an den Client gesendet werden, sodass er vom Anrufer überprüft werden sollte.preg_quote()
wird das * -Zeichen zitieren und sostr_replace()
hinterlässt das zum Beispiel ein verwaistes "\".Bei der Einstellung
Access-Control-Allow-Origin
in .htaccess hat nur Folgendes funktioniert:Ich habe versucht , einige andere vorgeschlagene Keywords
Header append
,Header set
, keine gearbeitet wie in vielen Antworten auf SO vorgeschlagen, obwohl ich keine Ahnung, wenn diese Keywords veraltet sind oder nicht gültig für nginx .Hier ist meine Komplettlösung:
quelle
Wir hatten ähnliche Probleme mit Font Awesome in einer statischen "Cookie-freien" Domain, als wir Schriften aus der "Cookie-Domain" (www.domain.tld) lasen, und dieser Beitrag war unser Held. Siehe hier: Wie kann ich das Webfont-Problem "Fehlender CORS-Antwortheader (Cross-Origin Resource Sharing)" beheben?
Für die Copy / Paste-R-Typen (und um einige Requisiten zu geben) habe ich dies aus allen Beiträgen zusammengesetzt und oben in der .htaccess-Datei des Site-Stamms hinzugefügt:
Super sicher, super elegant. Ich liebe es: Sie müssen die Bandbreite Ihres Servers nicht für Ressourcendiebe / Hotlinker-Typen öffnen.
Requisiten an: @Noyo @DaveRandom @ pratap-koritala
(Ich habe versucht, dies als Kommentar zur akzeptierten Antwort zu hinterlassen, aber das kann ich noch nicht.)
quelle
Für Frühling Stiefel Ich fand diese ,
RegexCorsConfiguration
die die offizielle erstrecktCorsConfiguration
: https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.javaquelle
Es sieht so aus, als ob die ursprüngliche Antwort für Pre-Apache 2.4 war. Bei mir hat es nicht funktioniert. Folgendes musste ich ändern, damit es in 2.4 funktioniert. Dies funktioniert für jede Tiefe der Subdomain von yourcompany.com .
quelle
Ich musste Lars ' Antwort ein wenig ändern , da ein verwaister
\
Mensch im regulären Ausdruck landete, um nur den tatsächlichen Host zu vergleichen (ohne auf das Protokoll oder den Port zu achten), und ich wolltelocalhost
neben meiner Produktionsdomäne auch eine Domäne unterstützen. Daher habe ich den$allowed
Parameter in ein Array geändert .Verwendung wie folgt:
quelle
in meinem Fall mit eckigen
in meinem HTTP Interceptor habe ich gesetzt
im Header der Anfrage
quelle