配置 Apache、Tomcat、mod_jk 和 mod_rewrite 以从顶层提供 tomcat 服务

配置 Apache、Tomcat、mod_jk 和 mod_rewrite 以从顶层提供 tomcat 服务

我正在尝试将我的 Java 应用程序设置为新站点的主要组件。

我有一些静态资源希望由 Apache 提供,因此我设置了 Apache 和 Mod_jk,并遵循以下规则,

    JkMount /java_app* ajp13
    JkUnmount /*static/* ajp13
    RewriteEngine On
    RewriteRule ^/$ /java_app/ [L,PT]

工人归档,一切工作顺利。当我去http://www.example.com/,由于重写规则,我获得了 Java 应用程序的索引文件。如果我浏览网站,由于 mod_jk,我仍然可以获得 Java 应用程序,例如http://www.example.com/java_app/view/1/

问题是:当我回到http://www.example.com,我完全丢失了所有会话信息。如果我之前登录过,现在我已退出,并且来自那里的链接将附加 jsessionid。

我该如何解决这个问题?这是连接 apache 和 tomcat 的正确方法吗,还是有更好的方法?

编辑:

回应第一个答案,

还是有点卡住。当我加载 Firebug 时,我导航到/

Set-Cookie JSESSIONID=8D63C9682E39B81F669E277ED07542E1; Path=/javaapp 

当我在 Java 应用程序内部浏览时,我发现同样的jsessionid情况 - Firebug 说我正在发送请求标头。

当我/再次点击时,我得到了这个响应,

Set-Cookie JSESSIONID=5DC9F39CE85AB1E71B8D87EB9D485FE9; Path=/javaapp

所以我猜 Apache 转发我的请求时没有包含我的 cookie 信息,所以 Tomcat 会给我一个新的 cookie?我可以让 mod_rewrite 说例如吗^/$ /javaapp/;jsessionid={cookie}

答案1

不要使用mod_jk2(已被弃用),但要使用mod_proxy代理通行证代理反向通道. 配置起来更容易,甚至静态内容的异常也可以轻松表达:

ProxyPass /statics !
ProxyPass / http://localhost:8080
ProxyPassReverse / http://localhost:8080

缺点很明显,如果 Java 应用程序想要读取客户端的 IP 地址(和其他客户端信息),它将获取 Apache 的地址,因为它是代理。对于这种情况,您需要使用mod_jk

答案2

我怀疑是 cookie 路径问题。要确认这一点,您可以启动 HTTP 调试器并分析 HTTP 流量。

答案3

设置 worker.worker1.sticky_session=1

我说使用 mod_jk,因为它是专门为 tomcat ajp 创建的,并且维护得很好(每年都会更新新功能)

答案4

您可以在配置中使用 mod_header 来实现这一点,它具有类似 mod_rewrite 的功能,但用于修改 http 标头。

将所有 cookie 路径从 /javaapp 更改为 /

Header edit Set-Cookie "^(.*; Path=)/javaapp/?(.*)" $1/$2

或者如果你想将 cookie 路径从 /javaapp 完全更改为 /my_java_app

Header edit Set-Cookie "^(.*; Path=)/javaapp/?(.*)" $1/my_java_app/$2

相关内容