4

作成した Facebook ページ タブに問題があります。

Web サイトは Chrome と Firefox では問題なく機能しますが、IE で簡単なことをしようとすると問題が発生します。

[BASE URL: http://domain.com/]
[REQ URL: http://domain.com/request]

私がやろうとしているのは、サーバーの BASE URL からサーバーへの簡単な ajax リクエストを REQ URL で再度行うことです。Chrome または Firefox では期待どおりの結果が得られますが、IE ではいくつかのエラーと警告が表示されます。

警告は次のとおりです (機密ドメイン情報なし)

SEC7118: XMLHttpRequest for https://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=URL_ENCODED_REDIRECT_URI required Cross Origin Resource Sharing (CORS).

SEC7119: XMLHttpRequest for https://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=URL_ENCODED_REDIRECT_URI required CORS preflight. 

エラーは次のとおりです。

SEC7120: Origin http://domain.com not found in Access-Control-Allow-Origin header.

SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.

私はこれらのエラーについて多くの調査を行いましたが、それらが Cross Origin Control に関連し、あるドメインから別のドメインに一致しないリクエストを行うことを知っています。奇妙なことに、両方のドメインが同じであるため、CORS は適用されません。何が欠けているのかわかりません。スタック オーバーフローに関する記事を少なくとも 20 件読んだことがありますが、どれも私の問題に正確に対処することはできません。

REQ_URL の /request/ は、コントローラーから呼び出されるメソッドです。このメソッドを呼び出すために必要なのは、特別なことは何もなく、単純な PHP 関数です。

function request() {
    return 'you win!';
}

ajax は jQuery を使用してリクエストを具体的に $.get メソッドにしています。これは私のコードです。

$.get('/request', function(response){
    console.log(response);
});

応答がありません。

私は $.ajax でもこれを試しました。完全なメソッドを呼び出すと、「エラー」のテキスト ステータス タイプが返されます。これは上記のエラーの結果であると予想されます。

以下の記事を読み、理解しました。

クロスオリジン リソース共有 同一オリジン ポリシー

Same-origin ポリシーによれば、私は CORS に縛られるべきではなく、get リクエストは機能するはずです。または、何か不足しています。

どんな助けでも大歓迎です。

['アップデート']

上記のエラーは、Facebook (Facebook ページ タブ) 内でのみ発生することを確認しました。これは、iframe がドメイン " http://static.ak.facebook.com/ " と私のドメイン "からのものであると思われます。 http://domain.com " これは、Same-origin ポリシー ルールに違反します。ajax 呼び出しが行われると、" http://static.ak.facebook.com/ " から " http://domain.com " に送信されるため、クロスオリジン ポリシー エラーが発生するため、非常に面倒です。

この問題を解決する方法はまだわかりません。

4

1 に答える 1

1

多くの賛成票、多くのビューはありません。

問題と解決策を見つけました。

サーバー側で情報を処理するためにセッションを使用していた私の特定のケースでは、セッションが IE 魔女に永続化されていなかったため、他のコードの一部が ajax リクエストを別のドメイン (facebook.com) にリダイレクトしていました。上記のクロス ドメイン リクエスト エラー。

ソリューション:

IE は ajax を介してセッションを渡すのが好きではないことがわかりましたが、他の最新のブラウザーに倣うのは良い考えであり、P3P ヘッダーを追加するのと同じくらい簡単であることがわかりました。

リクエストを送信する前にこれをコードに追加すると、セッション変数がリクエストで送信されます。

  header('P3P:  CP="IDC  DSP  COR  ADM  DEVi  TAIi  PSA  PSD  IVAi  IVDi  CONi  HIS  OUR  IND  CNT"');

セッションにあまり依存せずにアプリケーションを書き直すことになりましたが、これは間違いなく IE と、それが ajax を介してセッションを処理する方法についての良い学習ポイントでした。

于 2013-08-26T01:29:47.143 に答える