2014-09-02 105 views
2

我們使用mod_jk在負載均衡器和Apache反向代理後面的各種Tomcat實例上運行約30個webapps。每個應用程序的公共URL被配置到代理後端Tomcat的Apache mod_jk配置中。後端Tomcat在與公共URL匹配的上下文路徑上運行應用程序。僞造/設置Tomcat上下文路徑

例如

domain.com/foo/bar/webapp -- mod_jk --> tomcat/foo/bar/webapp 

這是因爲應用程序中使用${pageContext.request.contextPath},例如建立在JSP的鏈接

<script src="${pageContext.request.contextPath}/resources/js/image-manipulation.js" >  </script> 

我想使這更鬆耦合和「containerise」的web應用,讓他們在自己的Tomcat容器每次運行,在默認情況下,即/而不需要知道他們的公共網址是。這將簡化管理Tomcat配置和mod_jk映射。

問題是應用程序如何構建絕對鏈接到本身,而不知道它的最終公共URL是什麼?有沒有辦法在mod_jk請求中傳遞URL,並讓Tomcat使用此URL覆蓋對${pageContext.request.contextPath}的調用?

還是在Apache中使用類似mod_substitute的東西時更好一點,即在頁面出現在Apache中時使用URL替換頁面中的固定字符串?這看起來效率不高,因爲Apache必須掃描所有頁面,然後才能找到&替換。

或者最好只是將它全部保留原樣,並使用上下文路徑作爲當前?

回答

0

我能想到的唯一的解決辦法是這樣的:

  • 配置的mod_jk通過JkEnvVar到想contextPath發送作爲變量(將在Tomcat中可以作爲一個請求PARAM)
  • 有過濾你的web應用程序包裝請求,並使用該變量來覆蓋getContextPath()
  • 也包裝你的迴應也處理sendRedirect()和其他類似的方法正確(可能不那麼容易)。

當然,如果tomcat可以爲你做所有這些......

相關問題