CORS Access-Control-Allow-Headers wildcard ถูกละเว้น?


119

ฉันมีปัญหาในการขอ CORS ข้ามโดเมนเพื่อให้ทำงานได้อย่างถูกต้องโดยใช้ Chrome

ขอส่วนหัว:

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

ส่วนหัวการตอบกลับ:

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

ข้อผิดพลาด:

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

และรหัส python ที่ให้บริการคำขอตัวเลือกคือ:

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()

ดูเหมือนว่าAccess-Control-Allow-Originตัวแทนจะถูกละเว้น?

คำตอบ:


186

เพิ่มการรองรับไวลด์การ์ดในAccess-Control-Allow-Headersส่วนหัวในมาตรฐานการครองชีพเฉพาะในเดือนพฤษภาคม 2016 ดังนั้นเบราว์เซอร์บางประเภทอาจไม่รองรับ ในเบราว์เซอร์ที่ยังไม่ได้ใช้สิ่งนี้จะต้องตรงกันทุกประการ: https://www.w3.org/TR/2014/REC-cors-20140116/#access-control-allow-headers-response-header

หากคุณคาดหวังส่วนหัวจำนวนมากคุณสามารถอ่านค่าของAccess-Control-Request-Headersส่วนหัวและสะท้อนค่านั้นกลับในAccess-Control-Allow-Headersส่วนหัวได้


55
resp.setHeader ("Access-Control-Allow-Headers", req.getHeader ("Access-Control-Request-Headers")); // อนุญาตส่วนหัวใด ๆ
Sam Barnum

3
บนทับทิม "if request.headers ['Access-Control-Request-Headers'] แล้วส่วนหัว ['Access-Control-Allow-Headers'] = request.headers ['Access-Control-Request-Headers'] end" โอเคสำหรับฉัน.
Tsuneo Yoshioka

1
@monsur: คำตอบนี้ชี้ให้เห็นว่าอนุญาตให้ใช้สัญลักษณ์แทนได้แล้วอย่างน้อยก็ในทางทฤษฎีดังนั้นฉันจึงอัปเดตคำตอบของคุณเพื่อให้สอดคล้องกับสิ่งนี้ หากคุณไม่ชอบสไตล์ของฉันอย่าลังเลที่จะแก้ไขตามรสนิยมของคุณ
MvG

2
คำเตือนคุณอาจประสบปัญหาโดยอาศัยการส่งกลับค่า Access-Control-Request-Headers หากคุณอนุญาตให้เบราว์เซอร์แคชการตอบสนอง preflight (ด้วย Access-Control-Max-Age) คุณไม่ทราบว่าคำขอแรกแสดงส่วนหัวทั้งหมดของคำขอที่ติดต่อกัน
Simon Ejsing

2
@monokrome จะดีมากถ้าคุณสามารถบอกเราได้ว่านี่จะเป็นปัญหาด้านความปลอดภัยในการผลิตอย่างไร ..
prettyvoid

53

ส่วนหัว CORS เหล่านั้นไม่รองรับ*เป็นค่าวิธีเดียวคือแทนที่*ด้วยสิ่งนี้:

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 ตัวอย่าง (รวม CORS):

<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>

คำถามที่พบบ่อย:

  • ทำไมAccess-Control-Allow-Headers, Access-Control-Expose-Headers, Access-Control-Allow-Methodsค่าเป็นซุปเปอร์ยาว?

    สิ่งเหล่านี้ไม่รองรับ*ไวยากรณ์ดังนั้นฉันจึงรวบรวมส่วนหัวที่พบบ่อยที่สุด (และแปลกใหม่) จากในเว็บในรูปแบบต่างๆ# 1 # 2 # 3 (และฉันจะอัปเดตรายการเป็นครั้งคราว)

  • ทำไมคุณถึงใช้Header unset ______ไวยากรณ์?

    เซิร์ฟเวอร์ GoDaddy (ซึ่งเว็บไซต์ของฉันโฮสต์บน .. ) มีข้อผิดพลาดแปลก ๆ ที่หากตั้งค่าส่วนหัวไว้แล้วค่าก่อนหน้านี้จะรวมค่าที่มีอยู่ .. (แทนที่จะแทนที่) ด้วยวิธีนี้ฉันจะ "ล้างข้อมูลล่วงหน้า" ค่าที่มีอยู่(เป็นวิธีแก้ปัญหาที่รวดเร็วและสกปรกจริงๆ)

  • ปลอดภัยสำหรับฉันที่จะใช้ 'ตามสภาพ' หรือไม่?

    อืม .. คำตอบส่วนใหญ่จะเป็นใช่เนื่องจาก.htaccessกำลัง จำกัด ส่วนหัวไว้ที่สคริปต์ (PHP, HTML, ... ) และทรัพยากร (.JPG, .JS, .CSS) ที่ให้บริการจากตำแหน่ง "โฟลเดอร์" ต่อไปนี้ คุณอาจต้องการลบAccess-Control-Allow-Methodsบรรทัดออก นอกจากนี้ยังConnection, Time-Zone, Keep-AliveและDNT, Accept-Ranges, Vary, X-UA-Compatible, X-Frame-Options, X-Content-Type-OptionsและX-Xss-Protectionเป็นเพียงข้อเสนอแนะของฉันใช้สำหรับบริการออนไลน์ของฉัน .. รู้สึกฟรีที่จะลบที่มากเกินไป ...

นำมาจากความคิดเห็นของฉันด้านบน


นี่ช่วยชีวิตฉันได้แน่นอน ฉันใช้ผู้ให้บริการ CDN โดยเปิดใช้งาน CORS และฉันก็อนุญาตให้ใช้งานในเว็บไซต์ของฉันโดยAccess-Control-Allow-Origin "*"ไม่มีอะไรทำงานจนกว่าฉันจะใช้สิ่งนี้ แม้แต่ผู้ให้บริการ CDN ก็ไม่มีคำตอบให้เรา ฉันเรียกใช้เว็บไซต์ในSitegroundบางทีในฐานะGoDaddyจำเป็นต้องยกเลิกการตั้งค่าทุกอย่างก่อน
Ignacio Bustos

โพสต์ที่ยอดเยี่ยมสิ่งนี้ควรถูกเลื่อนขึ้นไปด้านบนของหน้า
CommonKnowledge

1
ในกรณีเฉพาะของฉันฉันต้องลบออกจากAccess-Control-Allow-Methodsวิธีการเหล่านี้ทั้งหมด: HTTP / 0.9, HTTP / 1.0, HTTP / 1.1, HTTP / 2
umbe1987

HTTP / 2 เป็น 'วิธีการ' ที่ถูกต้องหรือไม่? การอัปเกรดจาก HTTP / 1.1 เป็น 2 ใช้งานได้หรือไม่ ถ้าฉันดูที่นี่: sookocheff.com/post/networking/how-does-http-2- ทำงานส่วน HTTP / ... ควรจะไปเป็นอันดับที่สามไม่ใช่อันดับแรกที่วางวิธีไว้
Henk Poley

บางทีเพื่อรองรับ HTTP / 2.0 คุณต้องเพิ่มเมธอด 'PRI'?
Henk Poley

17

ฉันพบว่าAccess-Control-Allow-Headers: *ควรตั้งค่าสำหรับคำขอ OPTIONS เท่านั้น หากคุณส่งคืนสำหรับคำขอ POST เบราว์เซอร์จะยกเลิกคำขอ (อย่างน้อยสำหรับ chrome)

โค้ด PHP ต่อไปนี้ใช้ได้กับฉัน

// 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: *");
}

ฉันพบคำถามที่คล้ายกันพร้อมคำตอบที่ทำให้เข้าใจผิด:

  • เธรดเซิร์ฟเวอร์แจ้งว่านี่เป็นบั๊ก 2 ปีของ chrome: Access-Control-Allow-Headersไม่ตรงกับ localhost ไม่ถูกต้อง: ฉันสามารถใช้ CORS กับเซิร์ฟเวอร์ภายในของฉันด้วยโพสต์ได้ตามปกติ
  • Access-Control-Allow-Headersไม่ยอมรับสัญลักษณ์แทน มันผิดเหมือนกันสัญลักษณ์แทนใช้ได้กับฉัน (ฉันทดสอบกับ Chrome เท่านั้น)

ฉันใช้เวลาครึ่งวันในการหาปัญหา

มีความสุขในการเขียนโค้ด


2
สัญลักษณ์แทน ("Access-Control-Allow-Headers: *") ใช้ไม่ได้สำหรับฉันใน Safari 7.0.4
Tsuneo Yoshioka

ฉันพบว่าการตั้งค่า Access-Control-Allow-Headers ใช้ได้กับ POST ใน Chrome เวอร์ชัน 40.0.2214.111 ม.
Derek Greer

3
นี้ไม่ได้ดูเหมือนขวา ..... ข้อมูลจำเพาะไม่อนุญาตให้มี*ในแม้สำหรับAccess-Control-Allow-Headers OPTIONS
Pacerier

1

อ้างจาก monsur

ส่วนหัว Access-Control-Allow-Headers ไม่อนุญาตให้ใช้สัญลักษณ์แทน ต้องตรงกันทุกประการ: http://www.w3.org/TR/cors/#access-control-allow-headers-response-header

นี่คือโซลูชัน php ของฉัน

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

1
ที่จริงทำไมไม่เพียงheader('Access-Control-Allow-Headers: ' . $_SERVER['HTTP_ACCESS_CONTROL_ALLOW_HEADERS']);
Pacerier

0

นี่คือคาถาสำหรับ nginx ภายใน a

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

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.