要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン '…'はアクセスを許可されていません


135

私は.htaccessを使用してURLを書き換えており、それを機能させるためにhtmlベースタグを使用しました。

ここで、ajaxリクエストを実行しようとすると、次のエラーが発生します。

XMLHttpRequestを読み込めませんhttp://www.example.com/login.php。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。http://example.comしたがって、オリジン ' 'はアクセスを許可されていません。


1
S:ネヴァーマインド...それは今働いている、私も間違いだったかわからない
Th3lmuu90

8
微妙なAltough、http://wordicious.comある別のドメインよりもhttp://www.wordicious.com/、このようにエラーが発生しました。ところで、それが現在機能していて、それ自体で元に戻った場合は、おそらく質問を削除する必要があります。
acdcjunior 2013

@acdcjuniorこれはエラーのようです。これはあなた側の鋭い観察です。それを回答として投稿したら、賛成票を投じます。
Waleed Khan、

5
質問が削除されなかったのはよいことです。
15年

回答:


170

メソッドを使用するaddHeader代わりにsetHeader

response.addHeader("Access-Control-Allow-Origin", "*");

*上記の行で許可されaccess to all domainsます。


許可する場合access to specific domain only

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

これを確認してくださいblog post


4
定義されていないaddheaderを示しています。説明していただけますか?
Vaisakh Pc 2014

9
これらの行はどこに置くのですか?
DaveWalley 2014年

14
これはどこに追加する必要がありますか?
Alex

1
そのブログ投稿はNode.jsについて述べており、表現しています。クライアント側のJavaScriptではありません。これが機能するかどうか誰でも確認できますか?
Sam Eaton、

1
この構成はクライアント側でのみ実行できるとは思いません。どこに配置するかについては、サーバー側のコード(おそらく要求への応答を構築するとき)にあります
Chirag Ravindra

145

エラーが発生する理由:

JavaScriptコードがによって制限されている同一生成元ポリシーのページから、意味www.example.com、あなただけ(AJAX)要求に位置サービスを行うことができます正確に同じドメイン、その場合には、正確にwww.example.comない example.com -なしwww-またはwhatever.example.com)。

あなたの場合、あなたのAjaxコードはにhttp://wordicious.comあるページからサービスに到達しようとしていますhttp://www.wordicious.com

非常に似ています、同じドメインではありません。また、それらが同じドメイン上にない場合、リクエストは、ターゲットのレスポーズにAccess-Control-Allow-Originヘッダーが含まれている場合にのみ成功します。

のページ/サービスはhttp://wordicious.comそのようなヘッダーを表示するように構成されていないため、そのエラーメッセージが表示されます。

解決:

言ったように、オリジン(JavaScriptのあるページがある)とターゲット(JavaScriptが到達しようとしている)ドメインは正確に同じでなければなりません。

あなたのケースはタイプミスのようです。のように見えhttp://wordicious.comhttp://www.wordicious.com実際には同じサーバー/ドメインです。修正するには、ターゲットとオリジンを同じように入力します。Ajaxコードでページ/サービスをリクエストしhttp://www.wordicious.comないようにしhttp://wordicious.comます。(おそらく'/login.php'、ドメインなしで、ターゲットURLを比較的に配置します)。



より一般的な注意:

問題がこの質問のようなタイプミスではない場合、解決策はをターゲットドメイン追加するAccess-Control-Allow-Originことです。追加するには、もちろん、そのアドレスの背後にあるサーバー/言語に依存します。場合によっては、ツールの構成変数が役立ちます。また、コードを使用して自分でヘッダーを追加する必要がある場合もあります。


62

.NETサーバーの場合、以下に示すようにweb.configでこれを構成できます。

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>

たとえば、サーバードメインがhttp://live.makemypublication.comで、クライアントがhttp://www.makemypublication.comであるとします 場合、サーバーのweb.configで次のように構成します。

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
     </customHeaders>
  </httpProtocol>
 </system.webServer>

さらに優れたソリューション。ありがとう
ANJYR-KODEXPRESSION 2015年

どうもありがとう。あなたは私の一日を救った。
Prateek Gupta

2年後も機能する:p
ユビキタス開発者

1
@SyedAliTaqi質問はphpなので、答えは過小評価されています。しかし、それは私にとってもうまくいきました:)
Ahmad Th

22

ブラウザからこのエラーメッセージが表示された場合:

要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン '…'はアクセスを許可されていません

制御できないリモートサーバーに対してAjax POST / GETリクエストを実行しようとしている場合は、この簡単な修正を忘れてください。

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

特にAjaxリクエストを実行するためにJavaScriptのみを使用している場合、本当に必要なのは、クエリを受け取ってリモートサーバーに送信する内部プロキシです。

まずJavaScriptで、次のような独自のサーバーへのAjax呼び出しを実行します。

$.ajax({
    url: yourserver.com/controller/proxy.php,
    async:false,
    type: "POST",
    dataType: "json",
    data: data,
    success: function (result) {
        JSON.parse(result);
    },
    error: function (xhr, ajaxOptions, thrownError) {
        console.log(xhr);
    }
});

次に、proxy.phpという単純なPHPファイルを作成して、POSTデータをラップし、パラメーターとしてリモートURLサーバーに追加します。Expedia Hotel検索APIでこの問題を回避する方法の例を紹介します。

if (isset($_POST)) {
  $apiKey = $_POST['apiKey'];
  $cid = $_POST['cid'];
  $minorRev = 99;

  $url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?' . 'cid='. $cid . '&' . 'minorRev=' . $minorRev . '&' . 'apiKey=' . $apiKey;

  echo json_encode(file_get_contents($url));
 }

行うことにより:

 echo json_encode(file_get_contents($url));

同じクエリを実行しているだけですが、サーバー側で実行すると問題なく動作するはずです。


@NizarBsbあなたはクレイジーです、あなたはそれを知っています!!!!!! :D、おかげでたくさんのあなたの答えは私の人生保存
フラッシュ

10

これは、phpページ「login.php」の最初に追加する必要があります。

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

5
間違いなく安全ではありません。
2015

7

オプションメソッドの応答にヘッダーのキー/値を配置する必要があります。たとえば、http://mydomain.com/myresourceにリソースがある場合 、サーバーコードで次のように記述します。

//response handler
void handleRequest(Request request, Response response) {
    if(request.method == "OPTIONS") {
       response.setHeader("Access-Control-Allow-Origin","http://clientDomain.com")
       response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
       response.setHeader("Access-Control-Allow-Headers", "Content-Type");
    }



}

3

基本的に、次の追加パラメーターを追加して、APIヘッダー応答を変更します。

Access-Control-Allow-Credentials:true

Access-Control-Allow-Origin:*

しかし、セキュリティに関してはこれは良い解決策ではありません


3

回避策は、「ソース」ホストで実行されているリバースプロキシを使用し、Fiddlerなどのターゲットサーバーに転送することです。

ここにリンク:http : //docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy

またはApacheリバースプロキシ...


これは、ドメインのApacheまたはNginx構成レベルで実行できます。たとえば、ユーザーがmysite.com(wwwなし)にアクセスしていて、XHRがwww.mysite.comを要求している場合、htaccessまたはhttpd.confディレクティブでこれを解決できますか?
codecowboy 14

確かに、フロントエンドアプリはリバースプロキシとして動作するはずです。たとえば、Apacheの場合、mod_proxyをインストールし、ProxyPassReversehttpd.apache.org/docs/current/mod/…)を使用してルールを設定する必要があります。同じ機能がNginxでも利用できるようです:wiki.nginx.org/LikeApache
hzrari

2

これをPHPファイルまたはメインコントローラーに追加します

header("Access-Control-Allow-Origin: http://localhost:9000");

終了するには-あなたも必要ですheader("Access-Control-Allow-Credentials: true");
アダム

1

httpd.confの以下のエントリで解決

#CORS Issue
Header set X-Content-Type-Options "nosniff"
Header always set Access-Control-Max-Age 1728000
Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH"
Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control"
Header always set Access-Control-Allow-Credentials true

#CORS REWRITE
RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
#RewriteRule ^(.*)$ $1 [R=200,L]
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]

Apache2、CentOS7、Larravel 5、およびReactで私のために機能した唯一の方法
Shakiba Moshiri

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.