„Access-Control-Allow-Origin“ Kelių kilmės sričių?

Ar yra būdas išspręsti kelis kryžminius domenus naudojant „ Access-Control-Allow-Origin antraštę?

Žinau apie * , bet jis yra per daug atviras. Aš tikrai noriu leisti tik keletą sričių.

Pavyzdžiui, kažkas panašaus:

 Access-Control-Allow-Origin: http://domain1.example, http://domain2.example 

Bandžiau pirmiau minėtą kodą, tačiau jis neveikia „Firefox“.

Ar galiu nurodyti kelis domenus, ar esu tik vienas?

889
31 окт. nustatė Thomas J Bradley, spalio 31 d. 2009-10-31 06:27 '09 6:27 am. 2009-10-31 06:27
@ 27 atsakymai

Atrodo, kad rekomenduojamas būdas tai padaryti yra priversti serverį perskaityti „Origin“ antraštę iš kliento, palyginti jį su domenų, kuriuos norėtumėte leisti, sąrašu ir, jei jis atitinka, persiųskite „ Origin antraštės vertę atgal klientui kaip „ Access-Control-Allow-Origin antraštę. reaguojant.

Naudodami .htaccess galite tai padaryti taip:

 # ---------------------------------------------------------------------- # Allow loading of external fonts # ---------------------------------------------------------------------- <FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.example|dev02.otherdomain.example)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header merge Vary Origin </IfModule> </FilesMatch> 
762
05 дек. atsakymas pateikiamas jau gruodžio 5 d 2009-12-05 03:10 '09, 3:10 2009-12-05 03:10

Kitas sprendimas, kurį naudoju PHP:

border=0
 $http_origin = $_SERVER['HTTP_ORIGIN']; if ($http_origin == "http://www.domain1.com" || $http_origin == "http://www.domain2.com" || $http_origin == "http://www.domain3.com") { header("Access-Control-Allow-Origin: $http_origin"); } 
182
17 сент. Atsakymą davė Nikolajus Ivanovas 17 sep. 2011-09-17 13:49 '11, 13:49, 2011-09-17 13:49

Jis dirbo man:

 SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.example|domain2\.example)$" origin_is=$0 Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is 

Įjungus .htaccess , jis tikrai veiks.

101
18 июня '12 в 9:31 2012-06-18 09:31 atsakymą pateikė Jay Dave birželio 18 d. 12 val. 9:31 2012-06-18 09:31

Turėjau tą pačią problemą su „woff-fonts“, kelioms subdomenams buvo suteikta prieiga. Jei norite leisti padomenius, pridėjau kažką panašaus į httpd.conf:

 SetEnvIf Origin "^(.*\.example\.com)$" ORIGIN_SUB_DOMAIN=$1 <FilesMatch "\.woff$"> Header set Access-Control-Allow-Origin "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN </FilesMatch> 

Kai kuriuose domenuose galite tiesiog pakeisti įprastą išraišką „ SetEnvIf .

85
18 мая '11 в 15:46 2011-05-18 15:46 atsakymą pateikė Staugaard gegužės 18 d., „11, 15:46 2011-05-18 15:46

Čia, kaip pakartoti „Origin“ antraštę, jei ji atitinka jūsų domeną naudojant „Nginx“, tai naudinga, jei norite pateikti keletą šriftų subdomenų:

 location /fonts { # this will echo back the origin header if ($http_origin ~ "example.org$") { add_header "Access-Control-Allow-Origin" $http_origin; } } 
58
13 сент. Atsakymas pateikiamas 13 mjallday sep . 2012-09-13 23:25 '12 23:25 2012-09-13 23:25

Štai ką aš padariau PHP programai, kuri prašo AJAX

 $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); } 

Jei mano serveris leidžia užklausos šaltinį, grįžkite $http_origin kaip Access-Control-Allow-Origin antraštės vertę, o ne grąžinti pakaitos simbolį * .

22
26 дек. Atsakymą pateikė Syed Rakib Al Hasan , gruodžio 26 d. 2012-12-26 00:48 '12 0:48 2012-12-26 00:48

Yra vienas trūkumas, kurį turėtumėte žinoti: kai tik pasirinksite šaltinio failus CDN (arba bet kuriame kitu serveriu, kuris neleidžia skriptų), arba jei jūsų failai yra saugomi tarpiniame serveryje, atsakymo keitimas grindžiamas užklausos antrašte. „neveiks.

18
20 февр. atsakymas, kurį pateikė Mark Feb 2010-02-20 22:18 '10 10:18 PM 2010-02-20 22:18

Keliems domenams .htaccess :

 <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(domain1.example|domain2.example)$" AccessControlAllowOrigin=$0$1 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header set Access-Control-Allow-Credentials true </IfModule> 
16
11 марта '14 в 19:51 2014-03-11 19:51 atsakymą pateikė George'as kovo 11, 14, 19:51 2014-03-11 19:51

Jei įdiegta IIS 7.5+ ir įdiegta URL Rewrite 2.0, žr. Šį atsakymą SO

14
27 июня '15 в 4:57 2015-06-27 04:57 atsakymą įteikė Paco Zarate birželio 27 d. 15: 4: 57 2015-06-27 04:57

Nginx vartotojams leiskite CORS naudoti kelis domenus. Man patinka „@marshall“ pavyzdys, nors jos antverpeliai atitinka tik vieną domeną. Kad atitiktų domenų sąrašą ir subdomeną, ši įprastinė išraiška leidžia lengviau dirbti su šriftais:

 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"; } } 

Tai atspindi tik „Access-Control-Allow-Origin“ antraštes, kurios atitinka nurodytą domenų sąrašą.

13
10 янв. atsakymą pateikė Adriano Rosa 10 jan. 2015-01-10 21:31 '15, 21:31 2015-01-10 21:31

Čia pateikiamas „Java“ žiniatinklio programų sprendimas, paremtas „yesthatguy“ atsakymu.

Aš naudoju Jersey REST 1.x

Konfigūruokite web.xml, kad sužinotumėte apie REST jersey ir CORSResponseFilter

  <!-- Jersey REST config --> <servlet> <servlet-name>JAX-RS Servlet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> <param-value>com.your.package.CORSResponseFilter</param-value> </init-param> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.your.package</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JAX-RS Servlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> 

Čia yra kodas „CORSResponseFilter“

 import com.sun.jersey.spi.container.ContainerRequest; import com.sun.jersey.spi.container.ContainerResponse; import com.sun.jersey.spi.container.ContainerResponseFilter; public class CORSResponseFilter implements ContainerResponseFilter{ @Override public ContainerResponse filter(ContainerRequest request, ContainerResponse response) { String[] allowDomain = {"http://localhost:9000","https://my.domain.example"}; Set<String> allowedOrigins = new HashSet<String>(Arrays.asList (allowDomain)); String originHeader = request.getHeaderValue("Origin"); if(allowedOrigins.contains(originHeader)) { response.getHttpHeaders().add("Access-Control-Allow-Origin", originHeader); response.getHttpHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true"); response.getHttpHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); } return response; } } 
10
15 сент. atsakymas duvo rugsėjo 15 d 2015-09-15 21:39 '15 , 21:39 2015-09-15 21:39

Kaip minėta, „ Access-Control-Allow-Origin turi būti unikalus, o „ Vary turi būti nustatytas kaip Origin jei esate už CDN (Content Delivery Network).

Atitinkama mano nginx konfigūracijos dalis:

 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'; } 
7
09 нояб. atsakymas pateikiamas hernvnc 09 lapkričio. 2015-11-09 18:59 '15, 18:59 2015-11-09 18:59

Galbūt aš klystu, bet, kiek matau, „ Access-Control-Allow-Origin “ yra "origin-list" kaip parametras.

Pagal apibrėžimą origin-list :

 origin = "origin" ":" 1*WSP [ "null" / origin-list ] origin-list = serialized-origin *( 1*WSP serialized-origin ) serialized-origin = scheme "://" host [ ":" port ] ; <scheme>, <host>, <port> productions from RFC3986 

Ir iš to aš tvirtinu, kad skirtingos kilmės yra leistinos, ir jos turi būti atskirtos tarpais.

7
10 окт. atsakymas pateikiamas drAlberT 10 okt. 2012-10-10 14:40 '12, 14:40, 2012-10-10 14:40

Aš stengiausi sukonfigūruoti šį domeną, kuris naudoja HTTPS, todėl nusprendžiau, kad galėčiau pasidalinti sprendimu. Httpd.conf faile naudoju šią direktyvą:

  <FilesMatch "\.(ttf|otf|eot|woff)$"> SetEnvIf Origin "^http(s)?://(.+\.)?example\.com$" AccessControlAllowOrigin=$0 Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin </FilesMatch> 

Pakeiskite example.com prie domeno vardo. <VirtualHost xxxx:xx> ją į <VirtualHost xxxx:xx> į savo httpd.conf failą. Atkreipkite dėmesį, kad jei „ VirtualHost turi prievado priesagą (pavyzdžiui :80 ), ši direktyva nebus taikoma „HTTPS“, todėl jūs taip pat turite eiti į / etc / apache 2 / sites-available / default-ssl ir pridėti tą pačią direktyvą šį failą, skyriuje <VirtualHost _default_:443> .

Atnaujinus konfigūracijos failus, jums reikės paleisti šias komandas terminale:

 a2enmod headers sudo service apache2 reload 
5
17 февр. atsakymas pateikiamas Alex W 17 vasario mėn. 2015-02-17 03:12 '15 at 3:12 2015-02-17 03:12

Jei turite problemų su šriftais, naudokite:

 <FilesMatch "\.(ttf|ttc|otf|eot|woff)$"> <IfModule mod_headers> Header set Access-Control-Allow-Origin "*" </IfModule> </FilesMatch> 
4
06 июля '14 в 20:43 2014-07-06 20:43 atsakymas pateikiamas daiktavardžiui liepos 14 d. 14 d. 20:43 2014-07-06 20:43

HTTP_ORIGIN nenaudoja visos naršyklės. Kaip saugus yra HTTP_ORIGIN? Man FF yra tuščias.
Turiu svetaines, kuriose leisiu prisijungti prie savo svetainės, kad galėčiau siųsti pagal svetainės identifikatorių, tada patikrinu savo duomenų bazę, kad galėčiau rašyti su šiuo identifikatoriumi ir gauti SITE_URL stulpelio (www.yoursite.com) vertę.

 header('Access-Control-Allow-Origin: http://'.$row['SITE_URL']); 

Net jei siuntimas galiojančiu svetainės identifikatoriumi reikalauja užklausos iš domeno, nurodyto mano duomenų bazėje, susijusio su šiuo svetainės identifikatoriumi.

1
03 мая '13 в 18:39 2013-05-03 18:39 atsakymas pateikiamas mathius1 03 Gegužės 13 d. 18:39 2013-05-03 18:39

Lankstesnis požiūris yra naudoti „Apache 2.4“ išraiškas. Galite suderinti domenus, kelius ir beveik visus kitus užklausos kintamuosius. Nors atsakymas * skirtas visiems, vieninteliai, kurie ją gauna, yra tie, kurie bet kuriuo atveju atitinka reikalavimus.

 <IfModule mod_headers.c> <If "%{HTTP:Host} =~ /\\bcdndomain\\.example$/i  %{HTTP:Origin} =~ /\\bmaindomain\\.example$/i"> Header set Access-Control-Allow-Origin "*" </If> </IfModule> 
1
20 июля '18 в 8:50 2018-07-20 08:50 Atsakymas buvo pateiktas Walf'ui liepos 18 d., 18 val. 8:50 ; 2018-07-20 08:50

Siekiant palengvinti prieigą prie įvairių domenų ASMX paslaugai, šią funkciją sukūriau global.asax faile:

 protected void Application_BeginRequest(object sender, EventArgs e) { string CORSServices = "/account.asmx|/account2.asmx"; if (CORSServices.IndexOf(HttpContext.Current.Request.Url.AbsolutePath) > -1) { string allowedDomains = "http://xxx.yyy.example|http://aaa.bbb.example"; if(allowedDomains.IndexOf(HttpContext.Current.Request.Headers["Origin"]) > -1) HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", HttpContext.Current.Request.Headers["Origin"]); if(HttpContext.Current.Request.HttpMethod == "OPTIONS") HttpContext.Current.Response.End(); } } 

Jis taip pat leidžia CORS apdoroti OPTIONS veiksmažodį.

1
12 нояб. Atsakymą pateikė Derek Wade 12 nov. 2016-11-12 02:59 '16 at 2:59 2016-11-12 02:59

Čia yra išplėstinė „apache“ versija, kurioje yra keletas naujausių ir planuojamų šrifto apibrėžimų:

 <FilesMatch "\.(ttf|otf|eot|woff|woff2|sfnt|svg)$"> <IfModule mod_headers.c> SetEnvIf Origin "^http(s)?://(.+\.)?(domainname1|domainname2|domainname3)\.(?:com|net|org)$" AccessControlAllowOrigin=$0$1$2 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header set Access-Control-Allow-Credentials true </IfModule> </FilesMatch> 
1
26 февр. Mike Kormendy atsakymas, pateiktas vasario 26 d 2015-02-26 23:46 '15, 23:46, 2015-02-26 23:46

Už gana paprastą .NET programų kopijavimą / įklijimą parašiau tai įgalinti CORS iš global.asax failo. Šis kodas atitinka šiuo metu priimtame atsakyme pateiktus patarimus, atspindinčius atsakyme nurodytą prašyme nurodytą kilmę. Jis veiksmingai pasiekia „*“ nenaudodamas. Taip yra todėl, kad ji apima keletą kitų CORS funkcijų, įskaitant galimybę siųsti AJAX XMLHttpRequest su atributu suCredentials nustatytu tiesu.

 void Application_BeginRequest(object sender, EventArgs e) { if (Request.HttpMethod == "OPTIONS") { Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); Response.AddHeader("Access-Control-Max-Age", "1728000"); Response.End(); } else { Response.AddHeader("Access-Control-Allow-Credentials", "true"); if (Request.Headers["Origin"] != null) Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]); else Response.AddHeader("Access-Control-Allow-Origin" , "*"); } } 
1
21 дек. atsakymą pateikė „ QA Collective“ 21 d. 2017-12-21 04:24 '17 at 4:24 2017-12-21 04:24

Ir dar vienas atsakymas Django. Jei norite, kad vienas rodinys leistų CORS iš kelių domenų, čia yra mano kodas:

1
28 сент. Atsakymas, kurį pateikė Silvain Sep 28 2016-09-28 14:05 '16, 14:05 pm 2016-09-28 14:05

Mėginys PHP kodą, kad žemėlapis subdomenai.

 if( preg_match("/http:\/\/(.*?)\.yourdomain.example/", $_SERVER['HTTP_ORIGIN'], $matches )) { $theMatch = $matches[0]; header('Access-Control-Allow-Origin: ' . $theMatch); } 
0
25 июня '13 в 10:53 2013-06-25 10:53 atsakymas pateikiamas blak3r birželio 25 d. 13 val. 10:53 2013-06-25 10:53

Jei bandysite naudoti daug kodų pavyzdžių, kad galėčiau dirbti CORS, verta paminėti, kad pirmiausia turite išvalyti talpyklą, kad galėtumėte išbandyti, jei ji iš tikrųjų veikia, panašiai kaip problemos, pavyzdžiui, kai seni vaizdai vis dar yra, net jei jis yra ištrintas serveryje (nes jis vis dar saugomas talpykloje).

Pavyzdžiui, „ CTRL + SHIFT + DEL “ „Google Chrome“ ištrinti talpyklą.

Tai padėjo man naudoti šį kodą bandant daug švarių .htaccess sprendimų, ir tai atrodė vienintelis būdas dirbti (bent jau man):

  Header add Access-Control-Allow-Origin "http://google.com" Header add Access-Control-Allow-Headers "authorization, origin, user-token, x-requested-with, content-type" Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" <FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.com|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin </IfModule> </FilesMatch> 

Taip pat atkreipkite dėmesį, kad yra daug sprendimų, kuriuos turite įvesti Header set ... , bet tai yra Header add ... Tikiuosi, kad tai padės kas nors keletą valandų patirti tas pačias problemas, kaip ir aš.

0
03 февр. Atsakymas, kurį pateikė AlexioVay 03 vasaris 2017-02-03 11:19 '17 at 11:19 2017-02-03 11:19

„ExpressJS“ programoms galite naudoti:

skelbimų SSL rodymą ir gramatiką RFC rodo, kad galite atskirti URL.  Nežinote, kaip gerai jis palaikomas skirtingose ​​naršyklėse. 

0
18 окт. Bob Aman paskelbė spalio 18 d 2013-10-18 15:39 '13, 15:39 pm 2013-10-18 15:39

Tai taip pat galime nustatyti „Asp.net“ programos „Global.asax“ faile.

 protected void Application_BeginRequest(object sender, EventArgs e) { // enable CORS HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "https://www.youtube.com"); } 
-2
31 марта '15 в 14:59 2015-03-31 14:59 atsakymas pateikiamas sudhAnsu63 kovo 31 d. 15, 14:59 2015-03-31 14:59

Atrodo, kad atsakymas yra skirtas naudoti antraštę daugiau nei vieną kartą. Tai yra vietoj siuntimo

 Access-Control-Allow-Origin: http://domain1.example, http://domain2.example, http://domain3.example 

Norėdami siųsti

 Access-Control-Allow-Origin: http://domain1.example Access-Control-Allow-Origin: http://domain2.example Access-Control-Allow-Origin: http://domain3.example 

Apache galite tai padaryti skyriuje httpd.conf <VirtualHost> arba .htaccess faile, naudodami mod_headers ir šią sintaksę:

 Header add Access-Control-Allow-Origin "http://domain1.example" Header add Access-Control-Allow-Origin "http://domain2.example" Header add Access-Control-Allow-Origin "http://domain3.example" 

Apgaulė yra naudoti kaip add kaip add .

-3
06 нояб. Atsakymą pateikė Ben C. Forsberg . 2010-11-06 01:22 '10 ne 1:22 am 2010-11-06 01:22