14

承認にセッションキーを使用する外部アプリケーションサーバーに単純なCORSリクエストを送信しようとしています。

$.ajax({
    type: "GET",
    url: "https://192.168.1.72:8442/api/file/",
    headers: {"Authorization": "3238562439e44fcab4036a24a1e6b0fb"}
});

Firefox 18、Opera 12.12、およびRekonq 2.0(WebKitも使用)では正常に動作しますが、Google Chrome(バージョン21および24を試してみました)では動作しません。Google Chromeでは、オプションリソースをネットワークインスペクターに読み込めず、アプリケーションサーバーがリクエストを受け取らないことが示されています。jQuery1.8.3と1.9.0を試しました。

Request URL:https://192.168.1.72:8442/api/file/
Request Headers
Access-Control-Request-Headers:accept, authorization, origin
Access-Control-Request-Method:GET
Cache-Control:no-cache
Origin:https://192.168.1.72:8480
Pragma:no-cache

リクエストからヘッダーを削除すると、Google Chromeでも401を受け取り、アプリケーションサーバーで認証が無効になっている場合にリソースにアクセスできます。どのヘッダーが送信されるかは関係ありません。送信できるヘッダーは{"Content-Type": "plain/text"}のみです。他のすべてのヘッダー名/値はGoogleChromeでエラーになりますが、上記のすべてのブラウザーで機能します。

Google ChromeがCORSリクエストのヘッダーを処理しないのはなぜですか?

4

4 に答える 4

16

これはGoogleChromeのバグです:http://code.google.com/p/chromium/issues/detail?id=96007

于 2013-01-27T19:51:15.153 に答える
4

Access-Control-Allow-Headers:*は「OPTIONS」リクエストに対してのみ設定する必要があることがわかりました。POSTリクエストのためにそれを返す場合、ブラウザはリクエストをキャンセルします(少なくともクロームの場合)

次のPHPコードは私のために働きます

// Allow CORS
header("Access-Control-Allow-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はローカルホストと一致しません。間違っています。通常、Postを使用してローカルサーバーにCORSを使用できます。Access-Control-Allow-Headersはワイルドカードを受け入れます。それも間違っています、ワイルドカードは私のために働きます(私はChromeでのみテストしました)

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

ハッピーコーディング

于 2013-06-15T15:46:26.637 に答える
3

APIサーバーで自己署名証明書を使用していますが、それが問題のようです。--disable-web-securityオプションでGoogleChromeを起動すると、リクエストヘッダー付きのCORSが機能していることがわかりました。これがない--disable-web-securityと、自己署名APIサーバーにCORSリクエストを送信できますが、ヘッダーを追加できません(Content-Typeを除く)。

于 2013-01-27T17:20:40.617 に答える
1

サーバー側:サーバーはヘッダー「Access-Control-Allow-Credentials」を設定し、許可されたヘッダーも「Access-Control-Allow-Headers」に設定する必要があります。

クライアント側:Authヘッダーを明示的に渡す代わりに、$。ajax()でxhrFieldsを設定できます。

xhrFields: {
    withCredentials: true 
}

詳細はこちら

于 2013-01-25T10:04:25.543 に答える