2012-03-08 5 views
5

クライアントでjQuery(1.7.1)パワードajaxを使用し、Python(django)サーバーでApacheを使用して簡単なクロスソースリソース共有を設定しようとしています。CORS Access-Control-Allow-From-Headerが正しいにもかかわらず

XMLHttpRequest cannot load http://myexternaldomain.com/get_data . Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin.

ヘッダは、私が送って(私はそれもブラウザを過ぎてきていることを確認していない)にしようとしているもの:私は私のヘッダが正しく設定されて読みましたが、私は次のエラーを取得しておくすべての命令によると、次のとおりです。

Request URL:http://myexternaldomain.com/get_data 
Accept:application/json, text/javascript, */*; q=0.01 
Origin:http://localhost:8080 
Referer:http://localhost:8080/static/js/test-zetta.html 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11 

javascriptのコードがoriginが正しく設定されていること

var request = $.ajax({ 
     url : "http://myexternaldomain.com/get_data", 
     type : "POST", 
     dataType : "json", 
     crossDomain : true 
    }); 

注意です。サーバーは、私が直接アドレスを訪問した場合、ヘッダがそれを設定し、クロスドメインに正しく

Access-Control-Allow-Origin:* 
Content-Type:application/json 
Date:Thu, 08 Mar 2012 05:06:25 GMT 
Server:Apache/2.2.20 (Ubuntu) 
Transfer-Encoding:chunked 

しかし設定されていることを確認するために表示される次のPythonコード

def process_response(self, response): 
    if response.has_header('Access-Control-Allow-Origin'): 
      return response 

    response['Access-Control-Allow-Origin'] = '*' 
    return response 

def get_orders(request): 
    """ Tell worker what to do """ 
    response_data = {} 
    response_data['action'] = 'probe' 
    response = process_response(HttpResponse(json.dumps(response_data), mimetype="application/json")) 
    return response 

を使用してヘッダーAccess-Control-Allow-Origin = *を追加します常に失敗します(chromeとfirefoxの両方を試しました)。私はthis質問に正確に選択した答えは1としてコードを実装しようとしたが、同じエラーを取得しました

更新

私が取得するために管理しているとして、私は、問題はサーバ側であることをかなり確信しています私のajaxは、別の公開CORS対応サーバーで作業することを要求しています。このパブリックサーバから戻ってくるヘッダと私の返ってきたヘッダを比較すると(私が同じドメインからテストすると)、違いを説明する大きな違いはありません(下記参照)。

私が除外した1つの微妙な点は、実際のドメインが複数のサブドメインのアマゾンドメインであるかどうかということです。 実際のアドレスhttp://ec2-23-20-27-108.compute-1.amazonaws.com/get_ordersです。私が間違っていることを調べるためにそれを調べてください。公開サーバーから

Access-Control-Allow-Origin:* 
Connection:Keep-Alive 
Content-Encoding:gzip 
Content-Length:622 
Content-Type:text/html 
Date:Thu, 08 Mar 2012 15:33:20 GMT 
Keep-Alive:timeout=15, max=99 
Server:Apache/2.2.14 (Ubuntu) 
Vary:Accept-Encoding 
X-Powered-By:Perl/5.8.7, PHP/4.4.0 

私のサーバーから - (クロスドメインを動作していない)

Access-Control-Allow-Origin:* 
Content-Encoding:gzip 
Content-Type:text/plain 
Date:Thu, 08 Mar 2012 15:32:24 GMT 
Server:Apache/2.2.20 (Ubuntu) 
Transfer-Encoding:chunked 
Vary:Accept-Encoding 
+1

私はこれまで、CORS for Jsonデータを有効にして成功したことはありませんでした。 CORSはそのような薄片になることがあります。 JSON-Pを返すほうがずっと良いでしょう。 – xbonez

+0

リモートサーバーとローカルクライアントの間の_final_ exchangeからヘッダーを送信するだけです。完全な交換を見ると、OPTIONSリクエストと、Access-Control-Allow-MethodsヘッダーとAccess-Control-Allow-Headersヘッダーが含まれているレスポンスが表示されます。 –

答えて

5

私はURLに行くことからの返事が誤解されていました。実際、問題はAjaxリクエストを行うときに403 firefoxではchromeではない)csrfの保護によるエラー。

+1

ああ、ありがとう。 'csrf_exempt'ラッパーの周りに私の' enable_cors'ラッパーがありました。私は、WTFのようだった... – orokusaki

5

ので、あなたのあなたは "プレフライト" 要求と応答を実装する必要があります状況は「not so simple」リクエストとしてカウントされます。 Originヘッダのみを必要とするBasic CORSは、 "application/x-www-form-urlencoded"、 "multipart/form-data"、 "text/plain"のコンテンツタイプしか持てません。 "application/json"を返すので、あなたはこの要件を満たしていません。

私はDjangoについて何も知らないが、Tomcat filterを使用してCORSサポートをアプリケーション外で実装する方が簡単だと分かった。あなたはDjangoでdo the same thingのように見えます。

2013-08-11: GitHubレポはもはや私たちのものではないようです。しかし、Djangoのパッケージはまだ利用可能になっているようです。https://pypi.python.org/pypi/django-cors/0.1

+0

ブラウザはプリフライト要求を処理するはずです...少なくともChromeはそうしています。 –

+0

しかし、サーバーはそれを認識しなければなりません。彼のスクリプトは、すべての要求にOriginヘッダーを追加するだけで、基本的な要求に応答します。 –

+0

私のデータを単純な文字列にして、$ .ajax呼び出しでプレーンテキストを期待し、mimetype = 'text/plain'をPythonで返すことでリクエストを単純化しようとしましたが、同じエラーが発生します。 – zenna

2

私は優れたdjango-cors-headersライブラリを使用していましたが、この問題も発生しました。私にとって、解決策は、デフォルトのCORS_ALLOW_HEADERSタプルに「accept-encoding」を追加することでした。

関連する問題