web-dev-qa-db-ja.com

Apacheをプロキシとして使用してJettyでセッションが失われました

EXist-dbをベースにしたアプリケーションがあります。基本的には、Jettyを使用するJava Webアプリケーションです。Apacheプロキシの背後にあるリモートLinuxサーバーで実行されます。

次のApache構成を使用します。

ServerName  domain.com
ProxyRequests       off
ProxyPass       /myapp   http://localhost:8899/exist/apps/myapp
ProxyPassReverse       /myapp   http://localhost:8899/exist/apps/myapp

セッション以外はすべて正常に動作します。リクエストごとに、セッションが更新されます。これは、リクエストのCookieヘッダーにJSESSIONIDが含まれていないが、レスポンスのSet-CookieヘッダーがJSESSIONID=oryq5odyt3f79xxax25n7x0h;Path=/existのようなものであることを意味します。また、アプリケーションでセッションIDをチェックして、セッションが毎回新しいことを確認します。

私は3つのテストシナリオを試しました:

テストシナリオA:

  • クライアント:Windows 7、Google Chrome
  • サーバー:Ubuntu 12.04.4 LTS(GNU/Linux 3.11.0-26-generic x86_64)、プロキシApache/2.4.9

テストシナリオB:

  • クライアント:Windows 7、Google Chrome
  • サーバー:CentOSリリース6.6(最終版​​)、プロキシApache/2.2.15

テストシナリオC(ローカル):

  • クライアント:Windows 7、Google Chrome
  • サーバー(同じラップトップ):Windows 7、プロキシなし

この問題はシナリオAとBの両方で発生しますが、Cでは発生しません。

セッションを機能させる方法について何かアイデアはありますか?

2
lagivan

次のApache構成で問題が解決します。

ServerName  domain.com
ProxyRequests       off
ProxyPass       /myapp   http://localhost:8899/exist/apps/myapp
ProxyPassReverse       /myapp   http://localhost:8899/exist/apps/myapp
ProxyPassReverseCookiePath /exist /

Cookie内のパスを/existから/に変更して、セッションがパスに適切にマップされるようにします。

場合によっては、Cookieのドメインを変更するために、次のディレクティブが必要になることがあります(ただし、私の場合は必要ありませんでした)。

ProxyPassReverseCookieDomain localhost domain.com

stackoverflow でさらに詳細を見つけました。

2
lagivan