2013-01-31 7 views
9

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

3つのサーバは、この問題に関与しています。我々は彼らA1A2、およびBを呼び出すことができます。

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

我々はBアプリケーションに WebアプリケーションからのクロスドメインAJAXリクエストを実行する必要があります。私たちはCORSを有効にすることを実験しましたが、IE < = 8で問題なく動作するようになっていたので、今はnginxプロキシルールを使用しています。フローはそのためです:ブラウザのAJAX要求 - >A1またはA2 - > nginxのプロキシ - >B

Bは、ステートフルで、機能に、ユーザーのセッションCookieが必要です。私たちが見ている何

はA1サーバーを使用している場合、これが正常に動作することですが、A2サーバーを使用した場合、Bはクッキーを引き出すことはできません。

私はA2A1からの要求のヘッダーを見てきましたし、彼らは同じです。どちらも、

は、私たちが見ることの要求がA2から来るとき$ _COOKIE [「SESSION_KEY」]が空であることであるが、適切に充填B上など、両方が同じ起源を持ち、ヘッダー内のクッキーのラインを持っていますリクエストがA1から来たときに出ます。

奇妙なことは、ヘッダー内のクッキーから特定の1つのクッキーキーを取り出しているだけで、リクエストがA2から来たときだけです。それは、A2細かいからヘッダー内の他のすべてのクッキーを解析し、要求がA1から来る場合、それはいくつかの理由で、ユーザのセッションクッキーを解析することはできませんが、それはうまくできます。

私はtcpdumpを使用し、これらのそれぞれのpcapsを取り、それらを差分を取っおよびヘッダーには何も特に違って見えていません。

私は、このスタックオーバーフローの問題を発見し、人々が彼のCookieヘッダー文字列が長すぎたので、それは言った:What could cause cookie to not be set in $_COOKIE when it's in $_SERVER私はそれがあまりにも長い鉱山の両方の成功と失敗の場合には、唯一の249文字の長さとしてはないと思います。

は、私はそれらを解析し、手動で$ _SERVERの外にクッキーをリッピング検討してる時点でだが、それは本当に愚かに聞こえると私は、根本的な問題を把握することを好むだろう。

+0

A1サーバーとA2サーバーの両方でユーザーのセッションが設定されていますか?どのようにセッションデータがサーバー上に作成されていますか?彼らは同じマシンですか? – voncox

答えて

0

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

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

私たちのネットワーク構成のおかげで、常にサーバBに接続するときは外部IP、A2に接続するときは内部IP、A1に接続するときは外部IPを受信しました。

A2が内部IPの要求をBに転送すると、KohanaのIPベースのクッキー保護が起動されました。これは、外部IPで作成されたクッキーが内部IPで使用されるためです。

0

IE < = 8を使用する際の1つの問題は、P3Pと呼ばれるものです。

server A2 server B$_COOKIEリクエストを送信しないためのよう
header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"'); 

、私はお勧めします:私はあなたのAJAX/JSON要求(インスタンス内のサーバーB)を受け入れるページにP3Pヘッダにドロップすると、この問題を解決することを見出しました_GETを使用してinitページの何らかの種類のリクエストをserver Bに送信します。このように処理され、server Bに格納されます。この情報が存在する必要がある残りのすべてのページについては、server Bを参照して情報が送信されているかどうかを判断したり、各ページに_GETデータを継続的に送信して、手元の情報と比較します。この情報は、変更する方がはるかに簡単であるため、厳密に監視する必要があります。

私はお詫びしますが、これは問題を解決するものではないが、代わりの解決法を提供する可能性があることを認識しています。

+1

これはIEだけでなく、すべてのブラウザで発生します。私は、リクエストがA2によって転送された場合にのみ、$ _SERVER ['HTTP_COOKIE_VARS']を手動で解析することを回避すると思いますが、根本的な問題を見つけることを好むでしょう。 – ashgromnies

+0

P3Pヘッダーの変更がうまくいかない理由は、この状況では、IEのXDomainRequestオブジェクトの制限があります。 *クッキーはまったくサポートしていません。地獄のように壊れているので、代わりにプロキシ処理をしなければなりません。 – ashgromnies

0

いくつかの時間前に、私はクロスドメインのajaxリクエストをしなければなりませんでした。明らかに、私はIEで(ヘッダ名を正確に覚えていない) "allow x-domain ajax"というヘッダーを設定しようとしたとき、同じ問題がありました。

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

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

0

サーバー間でGETを使用します。それで全部です。サーバーが要求を完了できなかった場合、ユーザーは実際のCookieコンテンツが表示されないようにします。

関連する問題