Apache httpd mod_rewrite 與 Tomcat 導致失去 JSESSIONID
我正在開發一個 Java Web 應用程序,我最近為此實現了一個身份驗證模組,該模組依賴於 JSESSIONID cookie 來辨識使用者。我在 eclipse 的本地 tomcat 上進行測試,一切正常……直到我在我們的 VPS(Centos)上部署了應用程序,並使用了一些更高級的設置結構:
- Apache HTTP 伺服器
- 幾個虛擬主機
- 所述 webapp 安裝在帶有 mod_jk 的虛擬主機中。它目前通過“sub.hostname.com/WEBAPP_NAME/home”訪問,但應該可以通過“sub.hostname.com/home”訪問。
在身份驗證更新之前,上述設置並不是什麼大問題(順便說一句,之前訪問是由 tomcat 的安全選項處理的)。舊的 VirtualHost 看起來像這樣並且工作正常:
<VirtualHost *:80> ServerName sub.hostname.com RewriteEngine on RewriteRule ^/(.+)$ /WEBAPP_NAME/$1 [L,PT] RewriteRule ^/$ /WEBAPP_NAME/home [L,PT] JkMount /* worker </VirtualHost>
**問題:**部署後,身份驗證不起作用,因為未寫入 JSESSIONID cookie。我刪除了 RewriteRules 並通過“sub.hostname.com/WEBAPP_NAME/home”訪問了應用程序,一切正常,我收到了一個 cookie。從這些觀察中,我猜這個問題是因為 URL 被重寫並且 Servlet 沒有將 cookie 寫入正確的路徑(?)如果是這種情況,我是否應該嘗試將 cookie 從應用程序中寫入其他路徑?
在 apache 或 tomcat 中是否有任何特定的設置可以處理這個問題?還是我最初選擇了錯誤的設置架構?
在閱讀了 CédricC 的建議後,我做了更多的研究,發現:Configuring Apache, Tomcat, mod_jk and mod_rewrite to serve up tomcat from top-level
我按照 Kevin Loney 的說明使用mod_headers模組直接從 Apache修改 http 標頭。
最後,我只需要將以下行添加到我的 VirtualHost 配置中,它將所有 cookie 路徑從更改
/WEBAPP_NAME
為/ (root)
:Header edit Set-Cookie "^(.*; Path=)/WEBAPP_NAME/?(.*)" $1/$2
替代方法 - 從 Tomcat 更改 cookie 路徑:
我還測試了在我的應用程序的 web.xml 中設置來自 Tomcat 的 cookie 路徑:
<session-config> <session-timeout>30</session-timeout> <cookie-config> <http-only>true</http-only> <path>/</path> <!-- changes the path --> <name>COOKIENAME</name> </cookie-config> </session-config>
從https://stackoverflow.com/questions/12755499/how-to-change-jsessionid-cookie-path-to-server-root-in-spring-app-on-jetty的問題中獲得了 web.xml 範例