2012-03-19 6 views
0

私は使用するように登録されているサイトのトップサイトに「投票」APIを作成しました。XMLHttpRequestクロスドメインスローエラー

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 

    <script type="text/javascript"> 

     var id = 1; 

     $(document).ready(function(){ 
      $.getJSON("http://mysite.com/index.php?page=vote", { id: id, hasVoted: 'unknown' }, function(data) { 
       if(data == 2) { 
        window.location.replace("http://mysite.com/index.php?page=vote&id=" + id); 
       } 
      }); 
     }); 

    </script> 

基本的に、私はユーザーのIDを与えてから、そのコードをファイルに入れます。 サイトは番号を返し、その上でユーザーをリダイレクトするかどうかを投票する。

ので、そのコードローカルホスト上のテストでは、このエラーがスローされます。私はこのコードを使用する場合

XMLHttpRequest cannot load http://mysite.com/index.php?page=vote&id=1&hasVoted=unknown. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 

    <script type="text/javascript"> 

     var id = 1; 

     $(document).ready(function(){ 
      $.getJSON("http://mysite.com/index.php?page=vote&callback=?", { id: id, hasVoted: 'unknown' }, function(data) { 
       if(data == 2) { 
        window.location.replace("http://mysite.com/index.php?page=vote&id=" + id); 
       } 
      }); 
     }); 

    </script> 

をそれからそれは何もしません。それはエラーを投げません。 (データが2の場合(URLを直接チェックすると、2を返します))。

少し試してみたらalert(data);まだ何も投げません。

私はこれについて完全に無知です。何かが助けになるでしょう。

+0

JSONPは魔法ではありません。 JSONPは、リモートURLがサポートしている場合にのみ使用できます。 – SLaks

+0

私が持っていた他の問題を考え出したので編集した質問。 –

+0

@SLaksリモートURLはどのようにそれをサポートしますか?編集:とにかく、ありがとう、ありがとう。 –

答えて

1

よく知られた問題で、ブラウザの原点制御:

ブラウザを使用すると、デフォルトでは「クロス起源」ドメインへのAJAX要求を行うことはできません。クロスオリジンとは、ポートまたはホストが異なることを意味します。したがって、サイトhttp://siteB/にリクエストを送信することはできませんが、要求を行うスクリプトはサイトAでホストされます。

単純な解決策は、すべてのドメインを1つのドメインにホストしてURL相対化することです。それが不可能な場合は、クロス・オリジン・コールをしない別の方法を見つけなければなりません。 いくつかの例:

  1. JSONP(のみGET)
  2. CORS(近代的なブラウザと非常に良い仕事の)
  3. は+

プロキシスクリプト

  • ウィンドウ間のPostMessageを使っiframが含まれます編集: 私は、これらのヘッダーを設定することによって、まずあなたのAPIサーバーのいくつかのものを許可します:

    header("Access-Control-Allow-Origin: *"); 
    header("Access-Control-Allow-Methods: POST, GET, OPTIONS"); 
    header("Access-Control-Allow-Headers: Authorization"); 
    

    これはInternet Explorerでは正しく動作しないため、XDomainRequestを使用する必要があります。しかしこれでヘッダーを送ることはできません。数日前にmy questionを参照してください。交差元ヘッダーを送信する必要がある場合

    +0

    私はJSONPを持っていませんか? –

    +0

    うーん、それもapi-server側で実装する必要があります。 –

    +0

    優れています。私はそれを働かせた。感謝万円! –