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前缀,需要做两处配置修改:
- 分别在
/contextOld和/context-new两个应用的META-INF/context.xml文件中,给<Context>标签添加crossContext="true"属性,开启Tomcat跨上下文访问权限:
<Context crossContext="true"> <!-- 其余原有配置保持不变 --> </Context>
- 排查Spring Security配置,确认防火墙没有拦截跨上下文的转发请求,可临时关闭Spring Security防火墙测试验证问题根因。
内容的提问来源于stack exchange,提问作者Mobin Skariya
相关产品推荐
相关产品推荐

