Apache-2.2
使用 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,每次都確認會話是新的。我嘗試了三種測試場景:
測試場景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上找到了更多細節。