Apache-2.2

使用 Apache 作為代理在 Jetty 中失去會話

  • May 5, 2015

我有一個基於 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,每次都確認會話是新的。

我嘗試了三種測試場景:

測試場景A:

  • 客戶端:Windows 7、Google瀏覽器
  • 伺服器:Ubuntu 12.04.4 LTS (GNU/Linux 3.11.0-26-generic x86_64),代理 Apache/2.4.9

測試場景 B:

  • 客戶端:Windows 7、Google瀏覽器
  • 伺服器:CentOS release 6.6 (Final),代理 Apache/2.2.15

測試場景 C(本地):

  • 客戶端:Windows 7、Google瀏覽器
  • 伺服器(同一台筆記型電腦):Windows 7,無代理

該問題出現在方案 A 和 B 中,但不出現在 C 中。

任何想法如何使會話工作?

以下 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上找到了更多細節。

引用自:https://serverfault.com/questions/688576