352

Sencha Touch 2 アプリケーション ( PhoneGapAjax.requestにラップ)でリモート PHP サーバーを作成しています。

サーバーからの応答は次のとおりです。

XMLHttpRequest はhttp://nqatalog.negroesquisso.pt/login.phpを読み込めません。http://localhost:8888Access-Control-Allow-Origin でオリジンが許可されていません。

この問題を解決するにはどうすればよいですか?

4

18 に答える 18

383

しばらく前に、この問題に関する記事、CrossDomainAJAXを書きまし

応答サーバーを制御できる場合にこれを処理する最も簡単な方法は、次の応答ヘッダーを追加することです。

Access-Control-Allow-Origin: *

これにより、クロスドメインAjaxが可能になります。PHPでは、次のように応答を変更する必要があります。

<?php header('Access-Control-Allow-Origin: *'); ?>

Header set Access-Control-Allow-Origin *設定は、Apache構成またはhtaccessファイルに入れるだけです。

これにより、CORS保護が効果的に無効になり、ユーザーが攻撃にさらされる可能性が非常に高くなることに注意してください。特にワイルドカードを使用する必要があることがわからない場合は、ワイルドカードを使用しないでください。代わりに、特定のドメインをホワイトリストに登録する必要があります。

<?php header('Access-Control-Allow-Origin: http://example.com') ?>
于 2012-04-13T14:54:20.963 に答える
64

サーバーを制御できない場合は、次の引数を Chrome ランチャーに追加するだけです--disable-web-security

通常の「Web サーフィン」にはこれを使用しないことに注意してください。参考までに、この投稿を参照してください: Chrome で同一オリジン ポリシーを無効にする.

Phonegap を使用して実際にアプリケーションをビルドし、デバイスにロードする場合、これは問題になりません。

于 2012-04-13T16:50:49.933 に答える
15

これは、 ASP.NET MVCをデータのソースとして使用して同じ問題を解決しようとしたときに、最初に表示された質問/回答でした。これでPHPの問題が解決されないことはわかっていますが、十分に価値のある関連性があります。

ASP.NET MVC を使用しています。Greg Brantのブログ投稿が役に立ちました。最終的に、[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]コントローラ アクションに追加できる属性 を作成します。

例えば:

public class HttpHeaderAttribute : ActionFilterAttribute
{
    public string Name { get; set; }
    public string Value { get; set; }
    public HttpHeaderAttribute(string name, string value)
    {
        Name = name;
        Value = value;
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.AppendHeader(Name, Value);
        base.OnResultExecuted(filterContext);
    }
}

そして、それを次のように使用します。

[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)
{
    return Json( "Some public result" );
}
于 2013-06-06T15:24:54.913 に答える
10

Matt Mombrea はサーバー側で正しいため、ホワイトリストの拒否という別の問題が発生する可能性があります。

phonegap.plist を構成する必要があります。(古いバージョンの phonegap を使用しています)

cordova の場合、ネーミングとディレクトリーにいくつかの変更がある可能性があります。しかし、手順はほとんど同じはずです。

最初に [サポート ファイル] > [PhoneGap.plist] を選択します。

ここに画像の説明を入力

次に、「ExternalHosts」の下

おそらく " http://nqatalog.negroesquisso.pt "の値を持つエントリを追加します。 * はデバッグ目的でのみ使用しています。

ここに画像の説明を入力

于 2012-04-23T04:46:10.933 に答える
8

これは、リファラーの「www」バージョンと「非 www」バージョンの両方を例外にする必要がある場合に便利です。

 $referrer = $_SERVER['HTTP_REFERER'];
 $parts = parse_url($referrer);
 $domain = $parts['host'];

 if($domain == 'google.com')
 {
         header('Access-Control-Allow-Origin: http://google.com');
 }
 else if($domain == 'www.google.com')
 {
         header('Access-Control-Allow-Origin: http://www.google.com');
 }
于 2013-06-18T17:37:50.500 に答える
7

これは、同一オリジン ポリシーによるものです。詳細については、Mozilla Developer NetworkまたはWikipediaを参照してください。

基本的に、あなたの例では、からではhttp://nqatalog.negroesquisso.pt/login.phpなくからのみページをロードする必要があります。nqatalog.negroesquisso.ptlocalhost

于 2012-04-13T14:51:30.883 に答える
7

これに対する簡単な解決策を紹介します。私の場合、サーバーにアクセスできません。その場合、Google Chromeブラウザーのセキュリティ ポリシーを変更して、Access-Control-Allow-Origin を許可することができます。これは非常に簡単です:

  1. Chrome ブラウザのショートカットを作成する
  2. ショートカット アイコンを右クリック -> プロパティ -> ショートカット -> ターゲット

に簡単に貼り付け"C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-securityます。

場所は異なる場合があります。そのショートカットをクリックしてChromeを開きます。

于 2013-10-16T04:01:55.230 に答える
7

さまざまな API を使用しているときに、これに数回遭遇しました。多くの場合、「&callback=?」を追加すると簡単に修正できます。文字列の最後まで。アンパサンドは文字コードでなければならない場合もあれば、"?": "?callback=?" である場合もあります。( jQuery での Forecast.io API の使用を参照)

于 2012-12-19T00:07:14.857 に答える
5

Ruby on Railsでは、コントローラーで次のことができます。

headers['Access-Control-Allow-Origin'] = '*'
于 2013-09-03T15:51:49.567 に答える
4

クロムでテストされた phonegap アプリケーションにも同じ問題があります。Chrome を開く前に、以下のバッチ ファイルを毎日使用する 1 つの Windows マシン。これを実行する前に、タスク マネージャーから chrome のすべてのインスタンスを削除する必要があることを忘れないでください。または、chrome を選択してバックグラウンドで実行しないようにすることもできます。

バッチ: (cmd を使用)

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security
于 2013-03-11T06:37:12.497 に答える
1

ルビー・シナトラで

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

みんなのために、または

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 
于 2015-06-07T20:16:51.847 に答える
0

リクエストを受け取ったら、

var origin = (req.headers.origin || "*");

応答する必要がある場合よりも、次のようにします。

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);
于 2014-09-09T23:10:26.763 に答える