You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat rewrite重写URL返回404但直接访问返回200问题求助

问题原因

你当前使用的Tomcat Host级RewriteValve默认执行内部转发逻辑,/contextOld和/context-new是两个独立的Web应用上下文,Tomcat默认禁止跨上下文内部转发,所以重写后的请求根本没有进入/context-new应用的处理流程,直接返回404。你日志中重写后的请求响应耗时仅2ms、直接访问请求耗时69ms也符合这个特征。
另外日志中出现的org.springframework.security.web.firewall.FirewalledResponse提示,也可能存在Spring Security防火墙拦截跨上下文转发请求的问题。

解决方案

方案1:改为客户端重定向(推荐,无兼容性问题)

修改rewrite.config规则,增加重定向标识,让浏览器主动跳转至新地址,地址栏会同步更新为新路径:

RewriteCond %{REQUEST_URI} ^/contextOld/.*$
RewriteRule ^/contextOld/(.*)$ /context-new/$1 [L,R=301]

301为永久重定向,适合正式业务切换场景;如果是临时切换可以改为R=302。

方案2:保留地址栏不变(内部跨上下文转发)

如果要求用户端地址栏始终显示/contextOld前缀,需要做两处配置修改:

  1. 分别在/contextOld和/context-new两个应用的META-INF/context.xml文件中,给<Context>标签添加crossContext="true"属性,开启Tomcat跨上下文访问权限:
<Context crossContext="true">
    <!-- 其余原有配置保持不变 -->
</Context>
  1. 排查Spring Security配置,确认防火墙没有拦截跨上下文的转发请求,可临时关闭Spring Security防火墙测试验证问题根因。

内容的提问来源于stack exchange,提问作者Mobin Skariya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:57:03