कॉर्स एक्सेस-कंट्रोल-अनुमति-हेडर वाइल्डकार्ड को अनदेखा किया जा रहा है?


118

मुझे क्रोम का उपयोग करके सही तरीके से काम करने के लिए एक क्रॉस डोमेन CORS अनुरोध प्राप्त करने में समस्या हो रही है।

अनुरोध हेडर:

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.

और विकल्प अनुरोध की सेवा करने वाला अजगर कोड है:

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वाइल्डकार्ड को नजरअंदाज किया जा रहा है?

जवाबों:


185

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 ("एक्सेस-कंट्रोल-अलाउंस-हेडर्स", req.getHeader ("एक्सेस-कंट्रोल-रिक्वेस्ट-हेडर्स")); // किसी भी हेडर की अनुमति दें
सैम बार्नम

3
माणिक पर, "if request.headers ['Access-Control-Request-Headers'] तो हेडर ['Access-Control-allow-Headers'] = request.headers ['Access-Control-Request-Headers']] अंत में देखें" मेरे लिए ठीक है।
त्सुने योशीका

1
@ मंसूर: इस जवाब ने बताया कि वाइल्डकार्ड्स को अभी अनुमति दी गई है, कम से कम सिद्धांत में, इसलिए मैंने इसे प्रतिबिंबित करने के लिए आपके उत्तर को अपडेट किया। यदि आपको मेरी शैली पसंद नहीं है, तो अपने स्वाद को संपादित करने के लिए स्वतंत्र महसूस करें।
एमवीजी 14

2
चेतावनी का एक शब्द, आप एक्सेस-कंट्रोल-कंट्रोल-रिक्वेस्ट-हेडर्स वैल्यू को वापस करने पर भरोसा करके मुसीबत में पड़ सकते हैं यदि आप ब्राउज़र को प्रीफ्लाइट रिस्पांस (एक्सेस-कंट्रोल-मैक्स-एज के साथ) कैश करने की अनुमति देते हैं। आप नहीं जानते कि पहला अनुरोध निरंतर अनुरोधों के सभी शीर्षकों को सूचीबद्ध करता है।
सिमोन

2
@monokrome बहुत अच्छा होगा यदि आप हमें बता सकते हैं कि यह उत्पादन में सुरक्षा की चिंता कैसे होगी ..
2012 को बहुत बढ़िया '23v'

52

उन कोर हेडर *मूल्य के रूप में समर्थन नहीं करते हैं , इसका एकमात्र तरीका इसके *साथ प्रतिस्थापित करना है:

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 सर्वर (जो मेरी वेबसाइट पर होस्ट किया गया है ..) में एक अजीब बग है जहां यदि हेडर पहले से सेट हैं, तो पिछला मान मौजूदा एक से जुड़ जाएगा .. (इसके स्थान पर) इस तरह से मैं मौजूदा मूल्यों को "प्री-क्लीन" करता हूं। (वास्तव में सिर्फ एक त्वरित और गंदा समाधान)

  • क्या 'as-is' का उपयोग करना मेरे लिए सुरक्षित है?

    खैर .. ज्यादातर का जवाब हां में होगा क्योंकि .htaccessलिपियों को लिपियों (PHP, HTML, ...) तक सीमित कर दिया जाता है और संसाधन (.JPG, .JS, .CSS) को "फ़ोल्डर" -location से सेवा दी जाती है। आप वैकल्पिक रूप से 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 "*"लेकिन जब तक मैंने इसका उपयोग नहीं किया, तब तक कुछ भी काम नहीं किया। सीडीएन प्रदाता के पास भी हमारे लिए कोई जवाब नहीं था। मैं साइटग्राउंड में वेबसाइट चलाता हूं , शायद, GoDaddy के रूप में , पहले सब कुछ शुरू करना अनिवार्य है।
इग्नासियो बस्टोस

उत्कृष्ट पोस्ट, इस पृष्ठ के शीर्ष पर टकरा जाना चाहिए।
कॉमनक्लाज जुले

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-work HTTP / ... भाग को तीसरे स्थान के रूप में जाना चाहिए, न कि पहले, जहां विधि रखी गई है।
हेंक पोली

शायद HTTP / 2.0 का समर्थन करने के लिए आपको 'PRI' विधि जोड़ने की आवश्यकता है?
हेंक पोली

17

मैंने पाया कि Access-Control-Allow-Headers: *केवल विकल्प अनुरोध के लिए सेट किया जाना चाहिए। यदि आप इसे POST अनुरोध के लिए लौटाते हैं तो ब्राउज़र अनुरोध को रद्द कर देगा (कम से कम क्रोम के लिए)

निम्नलिखित 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 साल का बग है: Access-Control-Allow-Headersलोकलहोस्ट के साथ मेल नहीं खाता। यह गलत है: मैं आमतौर पर पोस्ट के साथ अपने स्थानीय सर्वर को कोर का उपयोग कर सकता हूं
  • Access-Control-Allow-Headersवाइल्डकार्ड स्वीकार करता है। यह भी गलत है, वाइल्डकार्ड मेरे लिए काम करता है (मैंने केवल क्रोम के साथ परीक्षण किया)

इस मुद्दे को जानने के लिए मुझे आधे दिन का समय चाहिए।

खुश कोडिंग


2
वाइल्डकार्ड ("एक्सेस-कंट्रोल-अलाउंस-हेडर्स: *") मेरे लिए काम नहीं करता था, सफारी 7.0.4 पर।
त्सुनेओ योशीका

मैंने पाया कि एक्सेस-कंट्रोल-अलाउंस-हेडर्स क्रोम वर्जन 40.0.2214.111 m में POST के लिए काम करता है।
डेरेक ग्रीर

3
यह प्रतीत नहीं होता है सही ..... कल्पना की अनुमति नहीं है *पर Access-Control-Allow-Headersके लिए भी OPTIONS
पचेरियर

1

महाशय से उद्धृत,

एक्सेस-कंट्रोल-अनुमति-हेडर हेडर वाइल्डकार्ड की अनुमति नहीं देता है। यह एक सटीक मिलान होना चाहिए: 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']);
पचेरियर

0

यहाँ nginx के लिए भस्म, अंदर एक

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

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.