CORS Access-Control-Allow-Headersワイルドカードは無視されますか?


118

Chromeを使用してクロスドメイン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.

オプションリクエストを提供する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、ワイルドカードは無視されていますか?

回答:


185

Access-Control-Allow-Headersヘッダーでのワイルドカードのサポートは、2016年5月にのみ生活標準追加されたため、すべてのブラウザーでサポートされているとは限りません。これをまだ実装していないブラウザーでは、完全に一致する必要があります: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
Rubyでは、「if request.headers ['Access-Control-Request-Headers'] then headers ['Access-Control-Allow-Headers'] = request.headers ['Access-Control-Request-Headers'] end」のように見えます大丈夫。
吉岡恒夫2014

1
@monsur:この回答は、少なくとも理論的にはワイルドカードが現在許可されていることを指摘したので、これを反映するように回答を更新しました。私のスタイルが気に入らない場合は、お好みに合わせて自由に編集してください。
MvG 2016

2
警告の言葉ですが、ブラウザがプリフライト応答を(Access-Control-Max-Ageで)キャッシュすることも許可している場合、Access-Control-Request-Headers値を返すことに依存することで問題が発生する可能性があります。最初のリクエストが連続するリクエストのすべてのヘッダーをリストしていることはわかりません。
Simon Ejsing 2017年

2
@monokromeは、これが本番
環境

52

これらの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-HeadersAccess-Control-Expose-HeadersAccess-Control-Allow-Methods値が超ロングですか?

    これらは*構文をサポートしていないため、Webから最も一般的な(そしてエキゾチックな)ヘッダーをさまざまな形式で収集しました#1 #2 #3 (そして、リストを随時更新します)

  • なぜHeader unset ______構文を使用するのですか?

    GoDaddyサーバー(私のWebサイトがホストされている..)には奇妙なバグがあり、ヘッダーがすでに設定されている場合、以前の値が既存の値に(置き換えではなく)結合されます。(本当に迅速で汚れたソリューションです)

  • 「現状のまま」を使用しても安全ですか?

    ええと、次の「フォルダ」の場所から提供されるスクリプト(PHP、HTML、...)とリソース(.JPG、.JS、.CSS)にヘッダーを制限しているため、ほとんどの場合、答えはYES.htaccessです。オプションでAccess-Control-Allow-Methods行を削除することもできます。またConnectionTime-ZoneKeep-AliveおよびDNTAccept-RangesVaryX-UA-CompatibleX-Frame-OptionsX-Content-Type-OptionsX-Xss-Protection私は私のオンラインサービスのために使用しているだけで提案されている。..あまりにもそれらを削除すること自由に感じ...

上記のコメントからの引用


これは間違いなく私の命を救った。CORSを有効にしてCDNプロバイダーを使用していて、Webサイトでそれを許可していましたが、Access-Control-Allow-Origin "*"これを使用するまで何も機能しませんでした。CDNプロバイダーでさえ答えはありませんでした。私はウェブサイトをSitegroundで実行しています。おそらくGoDaddyとして、最初にすべての設定を解除する必要があります。
イグナシオブストス2018年

すばらしい投稿です。これは、このページの上部に配置する必要があります。
CommonKnowledge 2018

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 / ...の部分は、メソッドが配置される最初の場所ではなく、3番目の場所として配置されることになっています。
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: *");
}

私はいくつかの誤解を招く応答で同様の質問を見つけました:

  • サーバースレッドによると、これはChromeの2年間のバグでありAccess-Control-Allow-Headers、localhostと一致しません。それは間違っています:PostでローカルサーバーにCORSを通常どおり使用できます
  • Access-Control-Allow-Headersワイルドカードを受け入れます。それも間違っています、ワイルドカードは私にとってはうまくいきます(私はChromeでのみテストしました)

この問題を理解するのに半日かかります。

ハッピーコーディング


2
Wildcard( "Access-Control-Allow-Headers:*")は、Safari 7.0.4では機能しませんでした。
吉岡恒夫

Access-Control-Allow-Headersを設定すると、Chromeバージョン40.0.2214.111 mのPOSTで機能することがわかりました。
デレクグリア2015

3
これは正しくないようです。.....仕様はでも許可さ*Access-Control-Allow-HeadersていませんOPTIONS
Pacerier

1

モンスールから引用、

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']);
パチェリエ2016年

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

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.