CORS Access-Control-Allow-Headers joker karakteri yok sayılıyor mu?


119

Chrome kullanarak doğru şekilde çalışmak için alanlar arası CORS isteği alma konusunda sorun yaşıyorum.

Üstbilgi İste:

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4

Yanıt üstbilgileri:

Access-Control-Allow-Headers:*
Access-Control-Allow-Origin:*
Allow:GET, POST, OPTIONS
Content-Length:0
Date:Tue, 30 Oct 2012 20:04:28 GMT
Server:BaseHTTP/0.3 Python/2.7.3

Hata:

XMLHttpRequest cannot load domain. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.

Ve seçenekler isteğine hizmet eden python kodu:

self.send_response(200)
self.send_header('Allow', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Headers', '*')
self.send_header('Content-Length', '0')
self.end_headers()

Görünüşe göre Access-Control-Allow-Originjoker karakter göz ardı ediliyor mu?

Yanıtlar:


186

Simgelemlerin desteği Access-Control-Allow-Headersbaşlığında edildi yaşam standardına eklenen tüm tarayıcılar tarafından desteklenmiyor olabilir bu nedenle, sadece Mayıs 2016 yılında. Bunu henüz uygulamayan tarayıcıda, tam olarak eşleşmelidir: https://www.w3.org/TR/2014/REC-cors-20140116/#access-control-allow-headers-response-header

Çok sayıda başlık bekliyorsanız, Access-Control-Request-Headersbaşlığın değerini okuyabilir ve bu değeri başlığa geri Access-Control-Allow-Headersyansıtabilirsiniz.


55
resp.setHeader ("Erişim-Kontrol-İzin Ver-Başlıkları", req.getHeader ("Erişim-Kontrol-İsteği-Başlıkları")); // başlıklara izin ver
Sam Barnum

3
Ruby'de, "if request.headers ['Access-Control-Request-Headers'] ardından üstbilgiler ['Access-Control-Allow-Headers'] = request.headers ['Access-Control-Request-Headers'] end" görünür benim için tamam.
Tsuneo Yoshioka

1
@monsur: Bu cevap joker karakterlere şimdi, en azından teoride izin verildiğine işaret etti, bu yüzden cevabınızı bunu yansıtacak şekilde güncelledim. Tarzımı beğenmediyseniz, zevkinize göre düzenlemekten çekinmeyin.
MvG

2
Bir uyarı kelimesi, tarayıcının ön kontrol yanıtını (Access-Control-Max-Age ile) önbelleğe almasına da izin verirseniz, Access-Control-Request-Headers değerini geri iletmeye güvenerek sorun yaşayabilirsiniz. İlk isteğin ardışık isteklerin tüm başlıklarını listelediğini bilmiyorsunuz.
Simon Ejsing

2
@monokrome, bunun üretimde nasıl bir güvenlik sorunu olacağını bize söylerseniz harika olur ..
prettyvoid

53

Bu CORS başlıkları *değer olarak desteklemiyor , tek yol *bununla değiştirmektir :

Accept, Accept-CH, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Ext, Accept-Features, Accept-Language, Accept-Params, Accept-Ranges, Access-Control-Allow-Credentials, Access-Control-Allow-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Origin, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Request-Headers, Access-Control-Request-Method, Age, Allow, Alternates, Authentication-Info, Authorization, C-Ext, C-Man, C-Opt, C-PEP, C-PEP-Info, CONNECT, Cache-Control, Compliance, Connection, Content-Base, Content-Disposition, Content-Encoding, Content-ID, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Script-Type, Content-Security-Policy, Content-Style-Type, Content-Transfer-Encoding, Content-Type, Content-Version, Cookie, Cost, DAV, DELETE, DNT, DPR, Date, Default-Style, Delta-Base, Depth, Derived-From, Destination, Differential-ID, Digest, ETag, Expect, Expires, Ext, From, GET, GetProfile, HEAD, HTTP-date, Host, IM, If, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Keep-Alive, Label, Last-Event-ID, Last-Modified, Link, Location, Lock-Token, MIME-Version, Man, Max-Forwards, Media-Range, Message-ID, Meter, Negotiate, Non-Compliance, OPTION, OPTIONS, OWS, Opt, Optional, Ordering-Type, Origin, Overwrite, P3P, PEP, PICS-Label, POST, PUT, Pep-Info, Permanent, Position, Pragma, ProfileObject, Protocol, Protocol-Query, Protocol-Request, Proxy-Authenticate, Proxy-Authentication-Info, Proxy-Authorization, Proxy-Features, Proxy-Instruction, Public, RWS, Range, Referer, Refresh, Resolution-Hint, Resolver-Location, Retry-After, Safe, Sec-Websocket-Extensions, Sec-Websocket-Key, Sec-Websocket-Origin, Sec-Websocket-Protocol, Sec-Websocket-Version, Security-Scheme, Server, Set-Cookie, Set-Cookie2, SetProfile, SoapAction, Status, Status-URI, Strict-Transport-Security, SubOK, Subst, Surrogate-Capability, Surrogate-Control, TCN, TE, TRACE, Timeout, Title, Trailer, Transfer-Encoding, UA-Color, UA-Media, UA-Pixels, UA-Resolution, UA-Windowpixels, URI, Upgrade, User-Agent, Variant-Vary, Vary, Version, Via, Viewport-Width, WWW-Authenticate, Want-Digest, Warning, Width, X-Content-Duration, X-Content-Security-Policy, X-Content-Type-Options, X-CustomHeader, X-DNSPrefetch-Control, X-Forwarded-For, X-Forwarded-Port, X-Forwarded-Proto, X-Frame-Options, X-Modified, X-OTHER, X-PING, X-PINGOTHER, X-Powered-By, X-Requested-With


.htaccess Örnek (CORS Dahil):

<IfModule mod_headers.c>
  Header unset Connection
  Header unset Time-Zone
  Header unset Keep-Alive
  Header unset Access-Control-Allow-Origin
  Header unset Access-Control-Allow-Headers
  Header unset Access-Control-Expose-Headers
  Header unset Access-Control-Allow-Methods
  Header unset Access-Control-Allow-Credentials

  Header set   Connection                         keep-alive
  Header set   Time-Zone                          "Asia/Jerusalem"
  Header set   Keep-Alive                         timeout=100,max=500
  Header set   Access-Control-Allow-Origin        "*"
  Header set   Access-Control-Allow-Headers       "Accept, Accept-CH, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Ext, Accept-Features, Accept-Language, Accept-Params, Accept-Ranges, Access-Control-Allow-Credentials, Access-Control-Allow-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Origin, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Request-Headers, Access-Control-Request-Method, Age, Allow, Alternates, Authentication-Info, Authorization, C-Ext, C-Man, C-Opt, C-PEP, C-PEP-Info, CONNECT, Cache-Control, Compliance, Connection, Content-Base, Content-Disposition, Content-Encoding, Content-ID, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Script-Type, Content-Security-Policy, Content-Style-Type, Content-Transfer-Encoding, Content-Type, Content-Version, Cookie, Cost, DAV, DELETE, DNT, DPR, Date, Default-Style, Delta-Base, Depth, Derived-From, Destination, Differential-ID, Digest, ETag, Expect, Expires, Ext, From, GET, GetProfile, HEAD, HTTP-date, Host, IM, If, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Keep-Alive, Label, Last-Event-ID, Last-Modified, Link, Location, Lock-Token, MIME-Version, Man, Max-Forwards, Media-Range, Message-ID, Meter, Negotiate, Non-Compliance, OPTION, OPTIONS, OWS, Opt, Optional, Ordering-Type, Origin, Overwrite, P3P, PEP, PICS-Label, POST, PUT, Pep-Info, Permanent, Position, Pragma, ProfileObject, Protocol, Protocol-Query, Protocol-Request, Proxy-Authenticate, Proxy-Authentication-Info, Proxy-Authorization, Proxy-Features, Proxy-Instruction, Public, RWS, Range, Referer, Refresh, Resolution-Hint, Resolver-Location, Retry-After, Safe, Sec-Websocket-Extensions, Sec-Websocket-Key, Sec-Websocket-Origin, Sec-Websocket-Protocol, Sec-Websocket-Version, Security-Scheme, Server, Set-Cookie, Set-Cookie2, SetProfile, SoapAction, Status, Status-URI, Strict-Transport-Security, SubOK, Subst, Surrogate-Capability, Surrogate-Control, TCN, TE, TRACE, Timeout, Title, Trailer, Transfer-Encoding, UA-Color, UA-Media, UA-Pixels, UA-Resolution, UA-Windowpixels, URI, Upgrade, User-Agent, Variant-Vary, Vary, Version, Via, Viewport-Width, WWW-Authenticate, Want-Digest, Warning, Width, X-Content-Duration, X-Content-Security-Policy, X-Content-Type-Options, X-CustomHeader, X-DNSPrefetch-Control, X-Forwarded-For, X-Forwarded-Port, X-Forwarded-Proto, X-Frame-Options, X-Modified, X-OTHER, X-PING, X-PINGOTHER, X-Powered-By, X-Requested-With"
  Header set   Access-Control-Expose-Headers      "Accept, Accept-CH, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Ext, Accept-Features, Accept-Language, Accept-Params, Accept-Ranges, Access-Control-Allow-Credentials, Access-Control-Allow-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Origin, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Request-Headers, Access-Control-Request-Method, Age, Allow, Alternates, Authentication-Info, Authorization, C-Ext, C-Man, C-Opt, C-PEP, C-PEP-Info, CONNECT, Cache-Control, Compliance, Connection, Content-Base, Content-Disposition, Content-Encoding, Content-ID, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Script-Type, Content-Security-Policy, Content-Style-Type, Content-Transfer-Encoding, Content-Type, Content-Version, Cookie, Cost, DAV, DELETE, DNT, DPR, Date, Default-Style, Delta-Base, Depth, Derived-From, Destination, Differential-ID, Digest, ETag, Expect, Expires, Ext, From, GET, GetProfile, HEAD, HTTP-date, Host, IM, If, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Keep-Alive, Label, Last-Event-ID, Last-Modified, Link, Location, Lock-Token, MIME-Version, Man, Max-Forwards, Media-Range, Message-ID, Meter, Negotiate, Non-Compliance, OPTION, OPTIONS, OWS, Opt, Optional, Ordering-Type, Origin, Overwrite, P3P, PEP, PICS-Label, POST, PUT, Pep-Info, Permanent, Position, Pragma, ProfileObject, Protocol, Protocol-Query, Protocol-Request, Proxy-Authenticate, Proxy-Authentication-Info, Proxy-Authorization, Proxy-Features, Proxy-Instruction, Public, RWS, Range, Referer, Refresh, Resolution-Hint, Resolver-Location, Retry-After, Safe, Sec-Websocket-Extensions, Sec-Websocket-Key, Sec-Websocket-Origin, Sec-Websocket-Protocol, Sec-Websocket-Version, Security-Scheme, Server, Set-Cookie, Set-Cookie2, SetProfile, SoapAction, Status, Status-URI, Strict-Transport-Security, SubOK, Subst, Surrogate-Capability, Surrogate-Control, TCN, TE, TRACE, Timeout, Title, Trailer, Transfer-Encoding, UA-Color, UA-Media, UA-Pixels, UA-Resolution, UA-Windowpixels, URI, Upgrade, User-Agent, Variant-Vary, Vary, Version, Via, Viewport-Width, WWW-Authenticate, Want-Digest, Warning, Width, X-Content-Duration, X-Content-Security-Policy, X-Content-Type-Options, X-CustomHeader, X-DNSPrefetch-Control, X-Forwarded-For, X-Forwarded-Port, X-Forwarded-Proto, X-Frame-Options, X-Modified, X-OTHER, X-PING, X-PINGOTHER, X-Powered-By, X-Requested-With"
  Header set   Access-Control-Allow-Methods       "CONNECT, DEBUG, DELETE, DONE, GET, HEAD, HTTP, HTTP/0.9, HTTP/1.0, HTTP/1.1, HTTP/2, OPTIONS, ORIGIN, ORIGINS, PATCH, POST, PUT, QUIC, REST, SESSION, SHOULD, SPDY, TRACE, TRACK"
  Header set   Access-Control-Allow-Credentials   "true"

  Header set DNT "0"
  Header set Accept-Ranges "bytes"
  Header set Vary "Accept-Encoding"
  Header set X-UA-Compatible "IE=edge,chrome=1"
  Header set X-Frame-Options "SAMEORIGIN"
  Header set X-Content-Type-Options "nosniff"
  Header set X-Xss-Protection "1; mode=block"
</IfModule>

SSS:

  • Neden Access-Control-Allow-Headers, Access-Control-Expose-Headers, Access-Control-Allow-Methodsdeğerler süper uzun?

    Bunlar *sözdizimini desteklemiyor , bu yüzden web'deki en yaygın (ve egzotik) başlıkları çeşitli formatlarda # 1 # 2 # 3 topladım (ve listeyi zaman zaman güncelleyeceğim)

  • Neden Header unset ______sözdizimi kullanıyorsunuz?

    GoDaddy sunucularında (web sitemin barındırıldığı ..) tuhaf bir hata var; üstbilgiler zaten ayarlanmışsa, önceki değer mevcut değerle birleşecek .. (onu değiştirmek yerine) bu şekilde mevcut değerleri "önceden temizleyeceğim" (gerçekten sadece hızlı ve kirli bir çözüm)

  • "Olduğu gibi" kullanmak benim için güvenli mi?

    Pekala .. çoğunlukla cevap EVET olacaktır, çünkü .htaccessbaşlıkları aşağıdaki "klasör" konumundan sunulan komut dosyaları (PHP, HTML, ...) ve kaynaklar (.JPG, .JS, .CSS) ile sınırlandırmaktadır. İsteğe bağlı olarak Access-Control-Allow-Methodshatları kaldırmak isteyebilirsiniz . Ayrıca Connection, Time-Zone, Keep-Aliveve DNT, Accept-Ranges, Vary, X-UA-Compatible, X-Frame-Options, X-Content-Type-Optionsve X-Xss-Protectionbenim çevrimiçi hizmet için kullanıyorum sadece bir öneri vardır .. çok bu kaldırmak için çekinmeyin ...

yukarıdaki yorumumdan alınmıştır


Bu kesinlikle hayatımı kurtardı. CORS etkinleştirilmiş bir CDN sağlayıcısı kullanıyordum ve ayrıca web sitemde buna izin veriyordum Access-Control-Allow-Origin "*"ama bunu kullanana kadar hiçbir şey işe yaramadı. CDN sağlayıcısının bile bizim için bir cevabı yoktu. Web sitesini Siteground'da çalıştırıyorum , belki de GoDaddy olarak önce her şeyin ayarını kaldırmak zorunludur.
Ignacio Bustos

Mükemmel gönderi, bu, bu sayfanın en üstüne çıkarılmalıdır.
CommonKnowledge

1
Benim özel durumumda, Access-Control-Allow-Methodstüm bu yöntemlerden kaldırmak zorunda kaldım : HTTP / 0.9, HTTP / 1.0, HTTP / 1.1, HTTP / 2
umbe1987

HTTP / 2 geçerli bir 'Yöntem' midir? HTTP / 1.1'den 2'ye yükseltme böyle mi çalışıyor? Buraya bakarsam : sookocheff.com/post/networking/how-does-http-2-work HTTP / ... kısmının Yöntemin yerleştirildiği ilk değil, üçüncü sırada yer alması gerekir.
Henk Poley

Belki HTTP / 2.0'ı desteklemek için 'PRI' yöntemini eklemeniz gerekir?
Henk Poley

17

Bunun Access-Control-Allow-Headers: *YALNIZCA SEÇENEKLER isteği için ayarlanması gerektiğini buldum . POST isteği için iade ederseniz, tarayıcı isteği iptal eder (en azından chrome için)

Aşağıdaki PHP kodu benim için çalışıyor

// Allow CORS
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');    
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
}   
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header("Access-Control-Allow-Headers: *");
}

Bazı yanıltıcı yanıtlarla benzer sorular buldum:

  • Sunucu iş parçacığı bunun 2 yıllık chrome hatası olduğunu söylüyor: Access-Control-Allow-Headerslocalhost ile eşleşmiyor. Yanlış: Normalde Post ile yerel sunucumda CORS'u kullanabilirim
  • Access-Control-Allow-Headersjoker karakterleri kabul ediyor. Ayrıca yanlış, joker karakter benim için çalışıyor (yalnızca Chrome ile test ettim)

Bu, sorunu çözmem yarım günümü alıyor.

Mutlu kodlama


2
Joker karakter ("Access-Control-Allow-Headers: *") Safari 7.0.4'te benim için çalışmadı.
Tsuneo Yoshioka

Access-Control-Allow-Headers ayarının, Chrome Sürüm 40.0.2214.111 m'de POST için çalıştığını buldum.
Derek Greer

3
Bu doğru görünmüyor ..... Spesifikasyon *için Access-Control-Allow-Headersbile izin vermiyor OPTIONS.
Pacerier

1

Monsur'dan alıntı,

Access-Control-Allow-Headers başlığı joker karakterlere izin vermez. Tam bir eşleşme olmalıdır: http://www.w3.org/TR/cors/#access-control-allow-headers-response-header .

İşte benim php çözümüm.

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  $headers=getallheaders();
  @$ACRH=$headers["Access-Control-Request-Headers"];
  header("Access-Control-Allow-Headers: $ACRH");
}

1
Aslında, neden basitçe olmasınheader('Access-Control-Allow-Headers: ' . $_SERVER['HTTP_ACCESS_CONTROL_ALLOW_HEADERS']);
Pacerier

0

işte nginx'in büyüsü, a'nın içinde

location / {
    # Simple requests
    if ($request_method ~* "(GET|POST)") {
      add_header "Access-Control-Allow-Origin"  *;
    }

    # Preflighted requests
    if ($request_method = OPTIONS ) {
      add_header "Access-Control-Allow-Origin"  *;
      add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
      add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
    }

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.