使用 Apache 作为代理的 Jetty 会话丢失

使用 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 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

我发现了更多细节堆栈溢出

相关内容