【问题标题】:Rewrite Rule appending webapp context path conflicts with <spring:url> and <c:url> taglibs重写规则附加 webapp 上下文路径与 <spring:url> 和 <c:url> 标签库冲突
【发布时间】:2025-12-11 02:35:01
【问题描述】:

我有一个 MV webapp,它使用&lt;c:url&gt;(或&lt;spring:url&gt;)jsp 标签在视图中生成链接。

我的 web 应用当前部署了上下文路径“/”,因此可以通过地址 http://mydomain 访问它。

现在我想用上下文路径/app 部署这个应用程序。

访问该应用的新 URL 现在是 http://mydomain/app

我不希望网络用户查看应用程序部署所在的 contextPath 并保持 URL 干净。我现在使用 RewriteRule 将 /app 附加到每个通过 Apache 的请求,然后再点击 Tomcat。

所以用户可以浏览到http://mydomain,重写规则会将请求转发到在上下文路径/app下部署的正确webapp。

我现在遇到的问题是,使用&lt;c:url&gt; 视图会在包含 contextPath 的 HTML 中生成页面链接。我正在尝试使用重写规则隐藏。

因此,在 /app 上下文下部署 webapp 后,HTML 包含类似 http://mydomain/app/other/careers.html 的链接,而不是 http://mydomain/other/careers.html

有没有办法解决这个问题而不必使用&lt;c:url&gt;修改所有页面?

taglib 的目的正是为了管理 contextPath,这样它就不会在页面中硬编码。但我的问题是,当我使用重写规则引擎时,我不再需要 HTML 页面中的这个上下文路径,因为我在重写规则本身中处理它。

【问题讨论】:

    标签: java spring-mvc nginx jstl taglib


    【解决方案1】:

    您可能需要在 http://tuckey.org/urlrewrite/ 上查看 UrlRewriteFilter

    使用这个项目,您可以操作 inboundoutbound 链接,后者是通过修改 c:url 在幕后执行的调用结果来完成的确定如何构建 URL。

    当前版本的文档似乎有点令人费解,但&lt;outboud-rule&gt; (https://cdn.rawgit.com/paultuckey/urlrewritefilter/master/src/doc/manual/4.0/index.html#outbound-rule) 元素是您要自动修改所有页面链接的元素。

    如果您只对所有链接使用c:url,那么您只需添加 UrlRewriteFilter 而无需更改单个页面。

    根据您的整体设置,UrlRewriteFilter 还可以处理传入的重写(独立于出站链接配置),因此可能不需要 mod_rewrite。

    希望这会有所帮助。

    【讨论】:

    • 感谢 jCoder。是的,我知道那个过滤器,但我试图让我的重写规则引擎与 java 过滤器代码分开。我也在使用它实际上是 nginx 而不是 apache2。
    • 这意味着响应——在被JSP服务器完全渲染之后——需要被解析并且所有的链接都需要被替换。我不是 nginx 专家,但是您尝试过类似 wiki.nginx.org/NginxHttpSubsModule 的方法吗?
    • 另外,您可能希望添加“nginx”作为标签并将有关您的重写引擎的额外信息放在您的问题中,因为只有“mod-rewrite”太令人困惑,因为它主要指的是 Apache mod_rewrite。
    • 非常感谢 jCoder。我会看看你建议我的模块