CORSリクエストについて読んでいて、通常のGETまたはPOSTリクエストを作成できましたが、正常に機能します。しかし、GETまたはPOSTリクエストすると、プリフライトOPTIONSリクエストがサーバーに送信され、500 INTERNAL SERVER ERRが表示されますが、実際のリクエストは送信されません。私の質問は、プリフライトが実際にどのように機能し、どのような応答が必要かということです。メインリクエストを送信しますか?それで動作すると確信しているので、プリフライトなしで送信することは可能ですか?serve-rsideはDjango 1.6で記述され、ACCESS- ALLOW-Originは*に設定され、通常のpostおよびgetリクエストで機能します。
これは私のJSコードです:
$.ajax({
type: "GET",
url: "http://url/login/",
async:false,
contentType: "application/json",
headers: {
"Authorization": "Basic " + btoa(loginName + ':' + password),
},
success: function (data) {
alert("OK!");
},
failure: function(errMsg) {
alert(errMsg);
}
});
これらは、リクエストが実行されたときのChrome DevToolsからのヘッダーです。リクエストヘッダー:
OPTIONS /login/ HTTP/1.1
Host: url
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Access-Control-Request-Headers: accept, authorization, content-type
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,hr;q=0.6,sr;q=0.4
応答ヘッダー:
HTTP/1.1 500 INTERNAL SERVER ERROR
Date: Thu, 31 Jul 2014 16:15:19 GMT
Server: Apache/2.2.15 (CentOS)
X-Frame-Options: SAMEORIGIN
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
承認ヘッダーを渡すには、Access-Control-Allow-Credentials
をtrueに設定する必要があります。
問題は、仕様( MDNで簡単に説明しています )に従って、Access-Control-Allow-Credentials
がtrueに設定されている場合、Access-Control-Allow-Origin
に*
を含めることができないため、資格情報が添付されたリクエストを作成するすべてのホストを許可します。
この問題を解決するには、次の2つのオプションがあります。
Access-Control-Allow-Origin
をリクエストを行う実際のホストに設定しますOrigin
ヘッダーを確認し、Origin
をAccess-Control-Allow-Origin
ヘッダー値として追加します。Djangoを使用すると、Origin
を確認し、ミドルウェアでヘッダーを追加できますが、それ自体で適切な質問が行われます(おそらくすでに質問されています)。