34

サーバー(CrossOriginFilterを使用するJetty)でクロスオリジンリソースシェアリングを設定しましたが、IE8とFirefoxで完全に機能します。Chromeでは、それは...そうではありません。

  $.ajax({ url : crossOriginURL,
    type : "GET",
    error : function(req, message) {
        alert(message);
    },
    dataType :  "json" } );

エラー関数が呼び出され、役立つメッセージ「error」が表示されます。リクエストを行っているようですが、期待するヘッダーがありません。URLが同じオリジンからのものである場合、それは正常に機能します。

4

8 に答える 8

26

私はこの方法で問題を解決しました:

これをPHPコードに追加します。

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true ");
header("Access-Control-Allow-Methods: OPTIONS, GET, POST");
header("Access-Control-Allow-Headers: Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control");

または、これらのヘッダーを応答に追加します。

問題:ブラウザは、メインリクエストの前にサーバーにオプションを要求し、サイトに異なる発信元との通信を許可するオプションがあるかどうかを確認し、許可されている場合は、POSTまたはGETリクエストを実行します。

編集:これを(ハックなしで)試して、データを受信して​​いるかどうかを確認してください...

$.ajax({ url : crossOriginURL,
    type : "GET",
    error : function(req, message) {
        alert(message);
    },
    success : function(data) {
        alert(data);
    },
    dataType :  "text"} );
于 2010-08-30T11:59:09.400 に答える
19

最終的に私のために働いたのはxhr.setRequestHeader('Content-Type', 'text/plain');

編集:Access-Control-Allow-Headers: Content-Typeこの問題を回避するには、サーバーを追加する必要があります。

私は10年後に自分の質問に戻ります。これが良いことなのか、ひどいことなのかわかりません。

于 2011-08-29T10:17:13.233 に答える
14

元の投稿者が問題を解決したようですが、コメンターのエリザベスと同じ問題を抱えている人にとっては、ChromeがCORSリクエストのOriginヘッダーを設定することを拒否している可能性があります。ローカルファイル。Originヘッダーを明示的にオーバーライドすることもできません。これにより、サーバーは「Origin:null」を認識し、ほとんどの場合403になります。私が多くの髪を引っ張った後に見つけたように、Firefoxには明らかにそのような制約はありません。

この場合、どうしてもChromeを使用する必要がある場合は、ウェブサーバーをローカルで実行し、file:ではなくhttp:を介して常にファイルにアクセスすることで問題を解決できます。

于 2012-10-31T08:58:50.960 に答える
2

問題に直面していたChromeを更新したとき、Google拡張機能の「Access-Control-Allow-Credentials」の新しいバージョンを解決しました。古いバージョンの場合は、新しいGoogleChromeバージョンで作業する必要はありません。

https://chrome.google.com/webstore/detail/access-control-allow-cred/hmcjjmkppmkpobeokkhgkecjlaobjldi?hl=en

于 2019-04-20T08:48:16.407 に答える
1

サーバーがクレデンシャルを許可するように設定しておらず、originヘッダーを許可するように*に設定していないことを確認してください。以下のように:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

サーバーがこれらのヘッダーに対してこれらの値を返している場合、サーバーは機能しません。に設定Access-Control-Allow-Credentialsすると、ヘッダーの値としてtrue使用できなくなります。以下は、ヘッダー( https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin)のMDNWebドキュメントからの抜粋です。*Access-Control-Allow-Origin

For requests without credentials, the literal value "*" can be specified, as a wildcard; 
the value tells browsers to allow requesting code from any origin to access the resource. 
Attempting to use the wildcard with credentials will result in an error.

上記の場合は、単にに設定Access-Control-Allow-Credentialsしてfalseください。

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: false

参考文献

于 2019-05-10T07:44:48.067 に答える
0

実際には2つのドメインがあります。1つはダッシュボード用でdashboard.app.com、もう1つは公開Webサイト用app.comです。リクエストは公開ウェブサイトからのものであり、PHPルーティングはダッシュボードドメインにリダイレクトされていたため、エラーが発生しました。解決策は、リダイレクトなしですべてのリクエストを同じドメイン内に保持することでした。

于 2021-05-21T05:01:03.533 に答える
-1

私の場合、localhost:7001(ノードサーバーとしてserver.js上)でAPIを呼び出そうとするのはlocalhost:8001(フロントエンド)です。CORSプラグインをインストールしてChromeをオンにしても、CORSポリシーはプリフライトケースとしてそれらを拒否しました。

最終的に問題を解決するのに半日以上かかりました。信じられないかもしれませんが、ここに「ばかげた」ステップがあります。

私。CORSプラグインをオフにし、アプリをリロードします。この時点でも、正しいエラーが発生するはずです。

ii。オンに戻し、アプリをリロードします。APIが成功した場合は、ここで停止します。iiiに進む必要はありません。

iii。ただし、それでもCORSが拒否される場合は、Chromeをアンインストールして、最新のChromeをインストールしてください。

iv。新しいChromeでは、以前にインストールされたCORSプラグインは引き続き存在しますが、ステータスはオフになっています。

v。ページをリロードすると、コンソールに正しいCORS拒否メッセージが表示されます。

vi。オンに戻し、ページをリロードすると、エラーが消えるはずです。

上記の手順がまだ機能しない場合は、これ以上のアイデアはありません。

また、server.js(ノード)で次のことを試しましたが、まだ機能しないため、わざわざ試す必要はありません。

var app = express();
var cors = require('cors'); // Already done “npm i cors --save-dev”
app.options('*', cors());
于 2017-10-11T20:16:06.643 に答える
-9

CORSはクロームで動作します。Chromeはセーフモードです。つまり、セキュリティ設定を無効にするだけです。それについてグーグルで検索するか、コマンドラインから開始することもできます。

于 2013-05-27T11:51:12.807 に答える