9

クロスドメインAJAXリクエストに問題があります。

この問題には3台のサーバーが関係しています。それらをA1A2、およびBと呼ぶことができます。

A1A2は同じアプリケーションコードを実行しています。これらは、同じWebアプリケーションの2つのステージングインスタンスです。Bは別のWebアプリケーションです。

AWebアプリケーションからBアプリケーションへのクロスドメインAJAXリクエストを実行する必要があります。CORSを有効にすることを試みましたが、IE <= 8で十分に機能させるのに苦労したため、現在はnginxプロキシルールを使用しています。したがって、フローは次のようになります。ブラウザのajaxリクエスト-> A1またはA2- >nginxプロキシ-> B

Bはステートフルであり、機能するにはユーザーのセッションCookieが必要です。

私たちが見ているのは、これはサーバーA1を使用している場合は正しく機能しますが、サーバーA2を使用している場合、BはCookieを引き出すことができないということです。

A1A2からのリクエストのヘッダーを確認しましたが、同じです。どちらもヘッダーにCookie行があり、どちらも同じオリジンを持っています。

Bで表示されるのは、リクエストがA2からのものである場合、$ _ COOKIE ['session_key']は空ですが、リクエストがA1からのものである場合は適切に入力されていることです

奇妙なことに、ヘッダー内のCookieから特定のCookieキーを1つ引き出すだけで、リクエストがA2から送信された場合にのみ欠落します。A2からのヘッダー内の他のすべてのCookieを正常に解析します。何らかの理由でユーザーのセッションCookieを解析できませんが、要求がA1からのものである場合は正常に解析できます。

私はtcpdumpを使用し、これらのそれぞれのpcapを取得してそれらを比較しましたが、ヘッダーの何も特に異なって見えません。

私はこのスタックオーバーフローの質問を見つけました、そして人々はそれが彼のクッキーヘッダー文字列が長すぎたためだと言いました:それが$_SERVERにあるときにクッキーが$_COOKIEに設定されない原因は何ですか?長い間、成功した場合と失敗した場合の両方で。

$ _SERVERからCookieをリッピングして手動で解析することを検討しているところですが、それは本当にばかげているように思われるので、根本的な問題を理解したいと思います。

4

4 に答える 4

0

IE <= 8を使用する場合の1つの問題は、P3Pと呼ばれるものです。AJAX / JSONリクエスト(インスタンスのサーバーB)を受け入れるページにP3Pヘッダーをドロップすると、この問題が解決することがわかりました。

header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');

にリクエストを送信しserver A2 ないことについては、のある種のページにを使用してリクエストを送信することをお勧めします。このようにして、を処理してに保存することができます。次に、この情報が存在する必要がある残りのすべてのページについて、情報が送信されたかどうかを確認するか、各ページにデータを継続的に送信して、すでに手元にある情報と比較することができます。覚えておくと、この情報は変更がはるかに簡単になるため、厳密に監視する必要があります。$_COOKIEserver B_GETinitserver Bserver Bserver B_GET

申し訳ありませんが、これで問題が解決するわけではありませんが、別の解決策を提供できる可能性があります。

于 2013-01-31T16:20:26.067 に答える
0

ここではPHPに問題はありませんでした。

Kohanaを使用していて、セッションCookieにセキュリティを追加するために、初期化時にコードを実行しました。問題のコードは、サーバー側のセッションで記録されたIPアドレスがリクエストヘッダーで送信されたIPアドレスと一致することを確認しました。

ネットワーク構成により、サーバーBに接続するときは常に外部IP、A2に接続するときは内部IP、A1に接続するときは外部IPを受け取りました。

A2が内部IPを使用してリクエストをBに転送すると、Cookieが外部IPで作成されたが、現在は内部IPで使用されようとしているため、KohanaのIPベースのCookie保護がトリガーされました。

于 2013-02-01T15:44:52.820 に答える
0

少し前に、クロスドメインajaxリクエストを実行する必要がありました。明らかに、IEで「x-domainajaxを許可する」ようにヘッダーを設定しようとしたときに同じ問題が発生しました(ヘッダー名を正確に覚えていない)。

これをソートするために私がしたことは、サーバーのajax間でCURLを使用することです。このようにして、私のajaxスクリプト(PHPで記述)は、関与するドメインに関係なく、JSON + CURLを介してサーバーを介してデータを交換し、CURL POSTを実行して送信し、CURLGETを介してデータを取得することができました。

すみません、これはあなたが必要とした答えではないかもしれませんが、IMO、これはクロスサイトajaxを探している人を助けるかもしれません。

于 2013-02-20T14:45:37.927 に答える
0

サーバー間でGETを使用します。それで全部です。また、サーバーがリクエストを完了できなかった場合に、実際のCookieコンテンツがプルされたことがユーザーに表示されないように、getをハッシュする方法を構築します。

于 2013-05-06T20:29:12.100 に答える