Czy istnieje sposób na zezwolenie na wiele domen w wielu domenach za pomocą Access-Control-Allow-Origin
nagłówka?
Jestem tego świadomy *
, ale jest zbyt otwarty. Naprawdę chcę pozwolić tylko na kilka domen.
Na przykład coś takiego:
Access-Control-Allow-Origin: http://domain1.example, http://domain2.example
Próbowałem powyższego kodu, ale wydaje się, że nie działa on w przeglądarce Firefox.
Czy można podać wiele domen, czy utknąłem tylko z jedną?
.htaccess
http
cors
xmlhttprequest
cross-domain
Thomas J Bradley
źródło
źródło
Access-Control-Allow-Origin
nagłówku nie oznacza, że inne domeny nie mogą wyzwolić metody w tym punkcie końcowym (np. metoda interfejsu API REST). Oznacza to po prostu, że niedozwolone źródła nie mogą używać wyniku w javascript (przeglądarka to zapewnia). Aby ograniczyć dostęp do punktu końcowego dla określonych domen, użyj filtru żądań po stronie serwera, który np. Zwraca HTTP 401 dla niedozwolonych domen.Vary: Origin
nagłówek, jeśli chcesz używać wielu adresów URL, patrz: fetch.spec.whatwg.org/#cors-protocol-and-http-cachesOdpowiedzi:
Wygląda na to, że zalecanym sposobem jest, aby Twój serwer odczytał nagłówek Origin od klienta, porównaj to z listą domen, na które chcesz zezwolić, a jeśli to pasuje, wyświetl wartość
Origin
nagłówka z powrotem do klienta jakoAccess-Control-Allow-Origin
nagłówek w odpowiedzi.Z
.htaccess
was może zrobić to tak:źródło
Inne rozwiązanie, którego używam w PHP:
źródło
header('Access-Control-Allow-Origin: *')
czasami mówi, nie można korzystać z dziką kartę, jeśli poświadczenia flaga jest prawda - dzieje się, kiedyheader('Access-Control-Allow-Credentials: true')
prawdopodobnie. Więc lepiej, aby Zezwalać na powstanie$http_origin
samego, jeśli warunki są spełnioneheader("Access-Control-Allow-Origin: " . $http_origin);
na, aby zadziałałoTo działało dla mnie:
Po włożeniu na
.htaccess
pewno będzie działać.źródło
Header set Access-Control-Allow-Credentials true
to działało jak odpowiedź @George'aReferer
zamiastOrigin
. UżywanieReferer
działa, ale problem polega na tym, że ustawia pełny adres URL z powrotem naAccess-Control-Allow-Origin
Chcę wyciąć nazwę domenyReferer
i przypisać jąAccess-Control-Allow-Origin
. Coś w tym stylu -echo http://example.com/index.php/ab/cd | cut -d'/' -f1,2,3
w poleceniu bash. Czy można to zrobić w pliku konf (apache)? Dowolny pomysł?Miałem ten sam problem z czcionkami woff, wiele subdomen musiało mieć dostęp. Aby zezwolić na poddomeny, dodałem coś takiego do mojego httpd.conf:
W przypadku wielu domen możesz po prostu zmienić wyrażenie regularne
SetEnvIf
.źródło
(.*\.?example\.org)
Dlaexample.com
isub.example.com
.subexample.com
. Powinieneś zmienić to na:((.*\.)?example\.org)
Oto jak ponownie wyświetlić nagłówek Origin, jeśli pasuje on do Twojej domeny z Nginx, jest to przydatne, jeśli chcesz wyświetlać czcionkę w wielu subdomenach:
źródło
.
w example.org jest interpretowana jako dowolna wartość, ponieważ jest to wyrażenie regularne? W takim przypadku, czy omyłkowo pozwoliłoby to na niestandardową domenę TLD w przykładzie?"^example\.org$"
tego, że musisz się upewnić, że haker nie prześlizgnie się po wyrażeniu regularnym za pomocąsubdomainexample.org
(użyj^
) lubexample.orgevil
(użyj$
) lubexamplezorg
(\.
Oto, co zrobiłem dla aplikacji PHP, o którą prosi AJAX
Jeśli żądający początek jest dozwolony przez mój serwer, zwróć go
$http_origin
jako wartośćAccess-Control-Allow-Origin
nagłówka zamiast zwracać*
symbol wieloznaczny.źródło
Jest jedna wada, o której powinieneś wiedzieć: jak tylko prześlesz pliki na zewnątrz CDN (lub innemu serwerowi, który nie zezwala na skrypty) lub jeśli twoje pliki są buforowane na serwerze proxy, zmiana odpowiedzi na podstawie „Origin” nagłówek żądania nie będzie działać.
źródło
Vary: Origin
nie jest obsługiwany przez Akamai , jedną z największych sieci CDN na rynku ... Więcej szczegółów również tutaj dostępnychW przypadku wielu domen w
.htaccess
:źródło
Header set Vary Origin
byłoby miłym dodatkiem do tej odpowiedzi.AccessControlAllowOrigin=$0$1
naAccessControlAllowOrigin=$0
. W przeciwnym razie nie działało to w przypadku źródeł HTTPS.http://example.com
wyszedł poprawnie, alehttps://example.com
wyszedł jakohttps://example.coms
, z dodatkowyms
na końcu.Użytkownicy Nginx zezwalają na CORS dla wielu domen. Podoba mi się przykład @ marshalla, chociaż jego odpowiedzi odpowiadają tylko jednej domenie. Aby dopasować listę domen i subdomen, to wyrażenie regularne ułatwia pracę z czcionkami:
Spowoduje to echo tylko nagłówków „Access-Control-Allow-Origin”, które pasują do podanej listy domen.
źródło
W przypadku IIS 7.5+ z zainstalowanym modułem URL Rewrite 2.0 zobacz tę SO odpowiedź
źródło
Oto rozwiązanie dla aplikacji internetowej Java, oparte na odpowiedzi yesthatguy.
Korzystam z Jersey REST 1.x
Skonfiguruj plik web.xml, aby był świadomy Jersey REST i CORSResponseFilter
Oto kod dla CORSResponseFilter
źródło
Jak wspomniano powyżej,
Access-Control-Allow-Origin
powinno być unikalne iVary
powinno być ustawione naOrigin
jeśli jesteś za CDN (Content Delivery Network).Odpowiednia część mojej konfiguracji Nginx:
źródło
set $cors
jakieś ukryte znaczenie, czy może jest specyficzne dla twojego conifg? wydaje się, że można go pominąć wraz z drugimif
Może się mylę, ale o ile widzę
Access-Control-Allow-Origin
ma"origin-list"
parametr as.Z definicji an
origin-list
to:I z tego, twierdzę, że różne źródła są akceptowane i powinny być oddzielone przestrzenią .
źródło
5.1 Access-Control-Allow-Origin Response Header
, że lista początkowa jest ograniczona: Zamiast zezwalać na listę początkową oddzieloną spacjami, jest to albo pojedyncze źródło, albo ciąg „null”.Do aplikacji ExpressJS możesz użyć:
źródło
Próbowałem to skonfigurować dla domeny z HTTPS, więc pomyślałem, że podzielę się tym rozwiązaniem. W pliku httpd.conf zastosowałem następującą dyrektywę :
Zmień
example.com
nazwę swojej domeny. Dodaj to do<VirtualHost x.x.x.x:xx>
swojego pliku httpd.conf . Zauważ, że jeśli maszVirtualHost
sufiks portu (np.:80
), To ta dyrektywa nie będzie miała zastosowania do HTTPS, więc musisz także przejść do / etc / apache2 / sites-available / default-ssl i dodać tę samą dyrektywę do tego pliku, wewnątrz z<VirtualHost _default_:443>
sekcji.Po zaktualizowaniu plików konfiguracyjnych należy uruchomić następujące polecenia w terminalu:
źródło
^http(s)?://(.+\.)?example\.com(:\d+)?$
Jeśli masz problemy z czcionkami, użyj:
źródło
Bardziej elastycznym podejściem jest użycie wyrażeń Apache 2.4. Możesz dopasować do domen, ścieżek i niemal każdej innej zmiennej żądania. Chociaż odpowiedź jest zawsze wysyłana
*
, jedynymi osobami, które ją odbierają, i tak spełniają te wymagania. UżycieOrigin
nagłówka żądania (lub dowolnego innego) w wyrażeniu powoduje, że Apache automatycznie łączy je zVary
nagłówkiem odpowiedzi, dzięki czemu odpowiedź nie będzie ponownie używana dla innego źródła.źródło
*
poświadczeń, takich jak Login. Tak więc lepiej będzie, jeśli podasz pasującą nazwę hosta zamiast*
.Access-Control-Allow-Origin
nagłówkaOPTIONS
żądania wstępnego sprawdzania, czy nagłówki sprawdzają, czy serwer zezwala na to pochodzenie. Mam to naprawione. To*
nie był dla mnie prawdziwy problem. Ale nadal niektóre przeglądarki nie akceptują*
z poświadczeniami, więc gdy aplikacja internetowa wysyła żądanie Cross-Origin, muszą określićHTTP_ORIGIN
nagłówek, który może uzyskać dostęp dynamicznie zmiennejOrigin
w.htaccess
Apache lub$_SERVER['HTTP_ORIGIN'];
PHP. W każdym razie twoje rozwiązanie jest dobre, ponieważ pozwala na wszystkie początki, ale mniej bezpieczne*
pozwala na wszystko. 2) HOST różni się od POCHODZENIA. HOST to rzeczywisty „HOST TARGET” przekazywany do nagłówka żądania. Ale ORIGIN to ten,INITIAL HOST
który wysyła żądanie doTARGET HOST
. Dlatego w kodzieORIGIN HOST
jest ignorowany i nigdy nie jest używany. Zobacz odpowiedzi powyżej, a zobaczysz, jak wykorzystująORIGIN
wartości, aby je dodaćAccess-Control-Allow-Origin
.*
Nie zezwala wszystkim, ponieważ użycieOrigin
nagłówka żądania w wyrażeniu powoduje, że Apache automatycznie scala go zVary
nagłówkiem odpowiedzi, chyba że zostanie użytyreq_novary('Origin')
(prawdopodobnie niepożądane). Przeglądarki wiedzą, że mogą otrzymać inną odpowiedź na inną,Origin
a jeśli wysłana wartość nie przejdzie testu,Access-Control-Allow-Origin
nagłówek nigdy nie jest ustawiony.HTTP_ORIGIN nie jest używany przez wszystkie przeglądarki. Jak bezpieczny jest HTTP_ORIGIN? Dla mnie jest pusta w FF.
Witryny, które zezwalam na dostęp do mojej witryny, przesyłam za pomocą identyfikatora witryny, a następnie sprawdzam, czy w mojej bazie danych nie ma rekordu o tym identyfikatorze, i otrzymuję wartość kolumny SITE_URL (www.yoursite.com).
Nawet jeśli przesłano prawidłowy identyfikator witryny, żądanie musi pochodzić z domeny wymienionej w mojej bazie danych powiązanej z tym identyfikatorem witryny.
źródło
Oto rozszerzona opcja apache, która zawiera niektóre z najnowszych i planowanych definicji czcionek:
źródło
Aby ułatwić dostęp do wielu domen dla usługi ASMX, utworzyłem tę funkcję w pliku global.asax:
Pozwala to również na obsługę
OPTIONS
czasownika przez CORS .źródło
Przykład kodu PHP dla pasujących subdomen.
źródło
Dla dość łatwego kopiowania / wklejania dla aplikacji .NET napisałem to, aby włączyć CORS z
global.asax
pliku. Ten kod jest zgodny z radą podaną w obecnie akceptowanej odpowiedzi, odzwierciedlając pochodzenie podane w zapytaniu w odpowiedzi. To skutecznie osiąga „*” bez użycia.Powodem tego jest to, że umożliwia wiele innych funkcji CORS , w tym możliwość wysyłania AJAX XMLHttpRequest z atrybutem „withCredentials” ustawionym na „true”.
źródło
Kod PHP:
źródło
I jeszcze jedna odpowiedź w Django. Aby jeden widok zezwalał na CORS z wielu domen, oto mój kod:
źródło
AWS Lambda / API Gateway
Aby uzyskać informacje na temat konfigurowania wielu źródeł w bezserwerowej AWS Lambda i API Gateway - aczkolwiek dość duże rozwiązanie dla czegoś, co mogłoby się wydawać, powinno być dość proste - zobacz tutaj:
https://stackoverflow.com/a/41708323/1624933
Obecnie nie można skonfigurować wielu źródeł w API Gateway, patrz tutaj: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html ), ale zalecenie (w odpowiedź powyżej) brzmi:
Proste rozwiązanie oczywiście umożliwia WSZYSTKIE (*) w następujący sposób:
Ale może być lepiej zrobić to po stronie API Gateway (patrz 2. link powyżej).
źródło
Access-Control-Allow-Credentials: true
nie jest dozwolone przy użyciu symboli wieloznacznychAccess-Control-Allow-Origin: *
.<origin>
Zamiast tego ustaw konkretny .Odpowiedź Google na wsparcie w wyświetlaniu reklam za pośrednictwem protokołu SSL i gramatyka w samym RFC wydaje się wskazywać, że możesz spować adresy URL. Nie jestem pewien, jak dobrze jest to obsługiwane w różnych przeglądarkach.
źródło
origin-list
: tools.ietf.org/html/rfc6454#section-7.1Jeśli spróbujesz użyć tak wielu przykładów kodu, jak ja, aby działało przy użyciu CORS, warto wspomnieć, że musisz najpierw wyczyścić pamięć podręczną, aby sprawdzić, czy rzeczywiście działa, podobnie jak w przypadku, gdy stare obrazy są nadal obecne, nawet jeśli są usunięty na serwerze (ponieważ nadal jest zapisany w pamięci podręcznej).
Na przykład CTRL + SHIFT + DELw Google Chrome, aby usunąć pamięć podręczną.
Pomogło mi to użyć tego kodu po wypróbowaniu wielu czystych
.htaccess
rozwiązań i wydawało mi się, że to jedyne działające (przynajmniej dla mnie):Zauważ również, że jest szeroko rozpowszechnione, że wiele rozwiązań mówi, że musisz pisać,
Header set ...
ale tak jestHeader add ...
. Mam nadzieję, że to pomaga komuś, kto ma takie same problemy od kilku godzin, jak ja.źródło
Poniższa odpowiedź jest specyficzna dla C #, ale koncepcja powinna mieć zastosowanie do wszystkich różnych platform.
Aby zezwolić na Żądanie krzyżowego pochodzenia z interfejsu internetowego, musisz zezwolić na Żądania opcji do swojej aplikacji i dodać poniżej adnotację na poziomie kontrolera.
[EnableCors (UrlString, Header, Method)] Teraz początki mogą być przekazywane tylko jako ciąg. SO, jeśli chcesz przekazać więcej niż jeden adres URL w żądaniu, podaj go jako wartość oddzieloną przecinkami.
UrlString = " https: //a.hello.com,https: //b.hello.com "
źródło
W nagłówku Access-Control-Allow-Origin można określić tylko jedno źródło. Ale możesz ustawić pochodzenie w swojej odpowiedzi zgodnie z żądaniem. Nie zapomnij także ustawić nagłówka Vary. W PHP zrobiłbym następujące czynności:
źródło
Możemy to również ustawić w pliku Global.asax dla aplikacji Asp.net.
źródło