2012-01-10 9 views
3

JavaScript経由でアクセスできるCORS対応APIを設定しようとしています。ブラウザとAJAX応答のCORSヘッダーが異なる

私がテストに使用しているコードは、このです:

$(function(){ 
get = function(url_fragment) 
{ 
    $.ajax({ 
     url:  'my_api', 
     dataType: 'json', 
     cache:  false, 
     success: function(data) 
     { 
      alert('success'); 
     }, 
     error:  function(data) 
     { 
      alert('failure'); 
     } 
    }) 
} 
get(''); 
}); 

それはかなり単純なAJAXリクエストです。

私は私のnginxの設定

add_header Access-Control-Allow-Origin *; 

でCORSを有効にしていると私のブラウザでAPIを訪れたとき、私は放火犯でXHRリクエストを表示すると、放火犯が期待されるヘッダ

Access-Control-Allow-Origin * 
Connection   keep-alive 
Content-Length  59 
Content-Type  application/json;charset=utf-8 
Server    nginx/1.0.11 + Phusion Passenger 3.0.11 (mod_rails/mod_rack) 
Status    200 
X-Frame-Options  sameorigin 
X-Powered-By  Phusion Passenger (mod_rails/mod_rack) 3.0.11 
X-XSS-Protection 1; mode=block 

を示しCORSヘッダーが存在しません:

Connection   keep-alive 
Content-Encoding gzip 
Content-Type  text/plain 
Server    nginx/1.0.11 + Phusion Passenger 3.0.11 (mod_rails/mod_rack) 
Status    403 
Transfer-Encoding chunked 
X-Frame-Options  sameorigin 
X-Powered-By  Phusion Passenger (mod_rails/mod_rack) 3.0.11 

私は正しいヘッダーを受信して​​いますグラムcurl

$ curl -i my_api 
HTTP/1.1   200 OK 
Content-Type:  application/json;charset=utf-8 
Connection:   keep-alive 
Status:    200 
X-Powered-By:  Phusion Passenger (mod_rails/mod_rack) 3.0.11 
X-Frame-Options: sameorigin 
X-XSS-Protection: 1; mode=block 
Content-Length:  61 
Server:    nginx/1.0.11 + Phusion Passenger 3.0.11 (mod_rails/mod_rack) 
Access-Control-Allow-Origin: * 

言うまでもなく、私はこれは、任意のアイデアを働いていない理由として困惑していますか?

答えて

4

add_headerは、新しいステータスコード(200,204,301,302または304)でのみ動作します。ヘッダを欠いているレスポンスは403なので、add_headerは動作しません。サードパーティのheaders moreモジュールは柔軟性があり、任意のステータスコードのヘッダーを追加できます。

+0

これはヘッダーの違いを説明していますが、元の場所が許可されていなかったため、403が返された理由があったと仮定していましたか? – djlumley

+0

私はなぜそれが403を返すのか分かりませんが、X-Powered-Byヘッダは私がそれがルビーアプリから来ていると思うようにします。 – kolbyjack

関連する問題