![使用 Apache 作为代理的 Jetty 会话丢失](https://linux22.com/image/657527/%E4%BD%BF%E7%94%A8%20Apache%20%E4%BD%9C%E4%B8%BA%E4%BB%A3%E7%90%86%E7%9A%84%20Jetty%20%E4%BC%9A%E8%AF%9D%E4%B8%A2%E5%A4%B1.png)
我有一个基于 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 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 中没有出现。
对于如何使会话正常运行,您有什么想法吗?
答案1
以下 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
我发现了更多细节堆栈溢出。