オリジンはAccess-Control-Allow-Originでは許可されていません


337

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

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

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

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


19
jQueryを使用している間、設定で問題dataType: 'jsonp',が解決します
2012年

11
ちなみにそれはサーバーからの応答ではありません。正確には、エラーはクライアント側で発行されます。
matteo 2013

2
JSONPトリックはおそらくFYI、もう動作しません:stackoverflow.com/questions/12216208/...を
drewww

7
注:このバグを追跡して半日無駄にしただけなので、サーバー側のスクリプトが内部サーバーエラーで失敗した場合、ブラウザーはそれをリクエストが許可されなかったものと解釈Access-Control-Allow-Originし、エラーとして報告することがあります。
troelskn 2013

1
@troelsknあなたは私の命を救った。私は3日間以来、いくつかのCORSの間違いを探していました。それは、500を引き起こす小さなSpring構成の問題でした。あなたのコメントを読んで実際に探したら、5分で解決しました。ありがとうございました!
Alexis Dufrenoy 2017年

回答:


378

この問題に関する記事は、しばらく前にクロスドメインAJAXと書いています

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

Access-Control-Allow-Origin: *

これにより、クロスドメインのAjaxが許可されます。PHPでは、次のように応答を変更します。

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

Apache構成またはhtaccessファイルにHeader set Access-Control-Allow-Origin *設定を置くだけです。

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

<?php header('Access-Control-Allow-Origin: http://example.com') ?>

4
サーバープロバイダーに連絡します。ありがとう
Ricardo

8
これにセキュリティ上の懸念はありますか?たとえば、この回答では、「JavaScriptはセキュリティ上の理由から「同じ生成元のポリシー」によって制限されています。たとえば、悪意のあるスクリプトはリモートサーバーに接続してサイトから機密データを送信できません。」
JohnK

4
すごい、これをnode.jsサーバーファイルに追加するだけです。response.writeHead(200、{'Content-Type':contentType、 'Access-Control-Allow-Origin': '*'}); そしてそれはうまくいった。ありがとう!
vbullinger 2012年

25
JohnKさん、そうです。ワイルドカードを使用すると、すべてのドメインがホストにリクエストを送信できるようになります。アスタリスクを、スクリプトを実行する特定のドメインに置き換えることをお勧めします。
Nick

7
ワイルドカードが@jfrejでさえ提案されるべきではないと思うのは興味深いことです。それはすべてあなたの目標次第です。たとえば、ワイルドカードを使用した(そしてこの回答を投稿した)理由は、どのサイトでも使用できる埋め込みウィジェットを作成していたためです。
Matt Mombrea、2013年

63

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

これは通常の「ウェブサーフィン」には使用しないことに注意してください。参考のため、この記事を参照してください:Chromeで無効に同一生成元ポリシーを

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


ありがとう。しかし、私のアプリはモバイルデバイスで実行されているので、引数をwebviewラッパーに渡すことができません。
Ricardo

最初にブラウザーでアプリをテストしませんか?どのようにデバッグしますか?
Travis Webb

はい、Chromeブラウザーでデバッグしますが、アプリはChromeで実行されません。それは私がコントロールできないphonegap webview witchにあります。
Ricardo

4
答えを読んでください:この引数をChromeランチャーに追加するだけです。Chromeの内部にはこの設定はありません
Travis Webb

2
もちろんそれは安全ではありません。OPはセキュリティ対策を回避する方法を求めています。
Travis Webb

42

Apacheを使用している場合は、以下を追加します。

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

あなたの構成で。これにより、ウェブサーバーからのすべての応答に、インターネット上の他のサイトからアクセスできるようになります。ホスト上のサービスのみを特定のサーバーで使用できるようにする場合*は、を元のサーバーのURLに置き換えることができます。

Header set Access-Control-Allow-Origin: http://my.origin.host

3
そして、モジュールをロードすることを忘れないでください:a2enmodヘッダー
Walery Strauch

module:a2enmodヘッダーを読み込む方法は?
Ayesha

18

あなたが持っている場合はASP.NET / ASP.NET MVCのアプリケーションを、あなたは、Web.configファイルを経由してこのヘッダを含めることができます。

<system.webServer>
  ...

    <httpProtocol>
        <customHeaders>
            <!-- Enable Cross Domain AJAX calls -->
            <remove name="Access-Control-Allow-Origin" />
            <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

2
.NET MVC People、LOOK here!私は実際に解決策をタイプしてブログでこの回答を指摘し、人々がより簡単に見つけられるようにします。.NET / MVCのハードルを乗り越え、PHP / jQueryソリューションを見つける以外に何も悪いことはありません。ありがとう@ Caio-Proiete
ottoflux

1
なぜこれがうまくいかないのですか?Chromeを使用していて、ローカルホストからyahooファイナンスページにアクセスしようとしています。
ニューマン2014

1
ありがとうございます。サーバー側のコードプロジェクト(web.config)に追加しました。
エテム

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" );
}

1
WebApi 2にはこれが組み込まれています。asp.net/web-api/overview/security/...
マットFrear

10

Matt Mombreaはサーバー側に適しているため、拒否をホワイトリストに登録するという別の問題に遭遇する可能性があります。

あなたはphonegap.plistを設定する必要があります。(私は古いバージョンの電話ギャップを使用しています)

コルドバの場合、名前とディレクトリにいくつかの変更がある可能性があります。ただし、手順はほとんど同じです。

まず、[サポートファイル]> [PhoneGap.plist]を選択します

ここに画像の説明を入力してください

次に「ExternalHosts」の下

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

ここに画像の説明を入力してください


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');
 }

azureでACAOエラーを解決する際に正しい方向に私を向けた 許可されたgoogledriveのホスト名を追加しましたが。URLは次のようにする必要性を使用GoogleドライブしないでGoogleドライブ
Kildareflare

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を開きます。


7

さまざまなAPIを操作しているときに、これに何度か遭遇しました。多くの場合、簡単な修正は「&callback =?」を追加することです。文字列の終わりまで。アンパサンドは文字コードである必要がある場合もあれば、「?」:「?callback =?」である場合もあります。(jQueryでのForecast.io APIの使用を参照)


6

Chrome拡張機能を作成していて、このエラーが発生した場合は、APIのベースURLをmanifest.json権限ブロックに追加したことを確認してください。例:

"permissions": [
    "https://itunes.apple.com/"
]

6

これは、同一生成元ポリシーのためです。詳細については、Mozilla Developer NetworkまたはWikipediaをご覧ください。

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


1
しかし、モバイルデバイスからWebサービスをロードする必要があります。これをバイパスしますか?
Ricardo

サーバー側で変更を加えるか、JSONP en.wikipedia.org/wiki/JSONPを
antyrat

6

Apacheを使用している場合は、次の内容で.htaccessファイルをディレクトリに追加します。

Header set Access-Control-Allow-Origin: *

Header set Access-Control-Allow-Headers: content-type

Header set Access-Control-Allow-Methods: *

5

Ruby on Railsには、コントローラで行うことができます。

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

それがajax呼び出しの場合、これをどのコントローラーに入れますか?より多くのコードコンテキストを表示できますか?
rigdonmr 2016年

5

Access-Control-Allow-Origin: *HTTP OPTIONSの応答にヘッダーを含むブラウザを作成することで、サーバーを変更せずに機能させることができます。

Chromeでは、この拡張機能を使用します。Mozillaを使用している場合は、この回答を確認してください。


5

これをAngular.jsで取得する場合は、次のようにポート番号をエスケープしてください。

var Project = $resource(
    'http://localhost\\:5648/api/...', {'a':'b'}, {
        update: { method: 'PUT' }
    }
);

詳細については、こちらをご覧ください。


4

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

バッチ:(cmdを使用)

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security


0

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

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

あなたが応答する必要があるときよりもそのようなもので行く:

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.