Opierając się na odpowiedzi DaveRandoma , również się pobawiłem i znalazłem nieco prostsze rozwiązanie Apache, które daje ten sam rezultat ( Access-Control-Allow-Origin
jest ustawiony na bieżący konkretny protokół + domena + port dynamicznie) bez użycia reguł przepisywania:
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"
I to wszystko.
Ci, którzy chcą włączyć CORS w domenie nadrzędnej (np. Mywebsite.com) oprócz wszystkich swoich subdomen, mogą po prostu zastąpić wyrażenie regularne w pierwszym wierszu tym:
^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$
.
Uwaga: W celu zapewnienia zgodności ze specyfikacją i prawidłowego zachowania w pamięci podręcznej ZAWSZE dodaj Vary: Origin
nagłówek odpowiedzi dla zasobów obsługujących CORS, nawet dla żądań innych niż CORS i tych z niedozwolonego źródła (patrz przykład dlaczego ).
//
tego w tym kontekście, ponieważ conf Apache nie używa wyrażeń regularnych rozdzielanych ukośnikiem. Regexr narzeka, ponieważ w tym kontekście ukośniki mają specjalne znaczenie jako ograniczniki.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.
Specyfikacja CORS jest „wszystko albo nic”. Obsługuje tylko
*
,null
czy domena dokładny protokół + port: http://www.w3.org/TR/cors/#access-control-allow-origin-response-headerTwój serwer będzie musiał sprawdzić poprawność nagłówka źródłowego za pomocą wyrażenia regularnego, a następnie możesz powtórzyć wartość początkową w nagłówku odpowiedzi Access-Control-Allow-Origin.
źródło
EDYCJA : Użyj rozwiązania @ Noyo zamiast tego. Jest prostszy, jaśniejszy i prawdopodobnie o wiele bardziej wydajny pod obciążeniem.
ORYGINALNA ODPOWIEDŹ POZOSTAŁA TUTAJ TYLKO DO CELÓW HISTORYCZNYCH !!
Rozmyślałem nad tym problemem i opracowałem to rozwiązanie wielokrotnego użytku .htaccess (lub httpd.conf), które działa z Apache:
Wystarczy ustawić
ACCESS_CONTROL_ROOT
zmienną w górnej części bloku na domenę główną, a ona wyśle echoOrigin:
wartość nagłówka żądania z powrotem do klienta wAccess-Control-Allow-Origin:
wartości nagłówka odpowiedzi, jeśli pasuje do twojej domeny.Zauważ też, że możesz użyć
sub.mydomain.com
jakoACCESS_CONTROL_ROOT
i to ograniczy początki dosub.mydomain.com
i*.sub.mydomain.com
(tj. Nie musi to być katalog główny domeny). Elementy, które mogą się zmieniać (protokół, port) mogą być kontrolowane przez modyfikację części wyrażenia regularnego URI wyrażenia regularnego.źródło
Odpowiadam na to pytanie, ponieważ zaakceptowana odpowiedź nie może wykonać następujących czynności
Na przykład: nie wysyła nagłówków CORS dla http://mywebsite.com, podczas gdy działa dla http://somedomain.mywebsite.com/
Aby włączyć witrynę, wystarczy umieścić ją w miejscu „mywebsite.com” w powyższej konfiguracji Apache.
Aby zezwolić na wiele witryn:
Testowanie po wdrożeniu:
Następująca odpowiedź na curl powinna mieć nagłówek „Access-Control-Allow-Origin” po zmianie.
źródło
Potrzebowałem rozwiązania tylko dla PHP, więc na wypadek, gdyby ktoś również go potrzebował. Pobiera dozwolony ciąg wejściowy, taki jak „* .example.com” i zwraca nazwę serwera nagłówka żądania, jeśli dane wejściowe są zgodne.
A oto przypadki testowe dla dostawcy danych phpunit:
źródło
preg_quote()
ponieważ jest to właściwy sposób na zrobienie tego (chociaż.
jest to jedyny meta-char wyrażenia regularnego prawidłowy w nazwie DNS,preg_quote()
lepiej opisuje zamierzoną operację)none
zgodnie ze specyfikacją nie jest to semantycznie poprawna wartość nagłówka (a przynajmniej nie robi tego, co to sugeruje). Jako takireturn null;
może mieć większy sens dla tego oddziału, w takim przypadku nagłówek nie powinien być wysyłany do klienta, więc powinien zostać sprawdzony przez osobę dzwoniącą.preg_quote()
cytuje znak *, więcstr_replace()
na przykład pozostawia osierocone „\”.Podczas ustawiania
Access-Control-Allow-Origin
w .htaccess działały tylko następujące elementy:Próbowałem kilka innych je słów kluczowych
Header append
,Header set
, nikt nie pracował jak zasugerowano w wielu odpowiedziach na SO, choć nie mam pojęcia, czy te słowa są nieaktualne lub niepoprawne dla nginx .Oto moje kompletne rozwiązanie:
źródło
Mieliśmy podobne problemy z Font Awesome w statycznej domenie „bez plików cookie” podczas czytania czcionek z „domeny plików cookie” (www.domain.tld) i ten post był naszym bohaterem. Zobacz tutaj: jak mogę rozwiązać problem z nagłówkiem odpowiedzi „Brak odpowiedzi nagłówka odpowiedzi CORS”?
Dla typów kopiuj / wklej-r (i podaj kilka rekwizytów) poskładałem to razem ze wszystkich wkładów i dodałem na początku pliku .htaccess katalogu głównego witryny:
Super Secure, Super Elegant. Uwielbiam to: nie musisz otwierać przepustowości serwerów dla typów złodziei zasobów / hot-link-er.
Rekwizyty do: @Noyo @DaveRandom @ pratap-koritala
(Próbowałem zostawić to jako komentarz do zaakceptowanej odpowiedzi, ale nie mogę tego jeszcze zrobić)
źródło
Dla Spring Boot znalazłem to,
RegexCorsConfiguration
co rozszerza oficjalnyCorsConfiguration
: https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.javaźródło
Wygląda na to, że oryginalna odpowiedź dotyczyła wersji Apache 2.4. Nie działało to dla mnie. Oto, co musiałem zmienić, aby działało w 2.4. Będzie to działać dla dowolnej głębokości poddomeny twojej firmy .
źródło
Musiałem nieco zmodyfikować odpowiedź Larsa , gdy osierocony
\
trafił do wyrażenia regularnego, aby porównać tylko rzeczywistego hosta (nie zwracając uwagi na protokół lub port) i chciałem wesprzećlocalhost
domenę oprócz mojej domeny produkcyjnej. Dlatego zmieniłem$allowed
parametr na tablicę.Zastosowanie w następujący sposób:
źródło
w moim przypadku za pomocą kątownika
w moim przechwytywaczu HTTP ustawiłem
w nagłówku żądania
źródło