Tomcat服务器做301重定向,首选方案是配置URL Rewrite Valve(rewrite.config),其次是用web.xml的error-page配redirect,或者在前置Nginx/Apache层统一处理。 三种方式都能实现永久跳转,但适用场景不同单应用迁移用Rewirte Valve最灵活,整站换域名走前置代理最省事。
下面按实际动手的顺序,把配置路径、命令、验证方法一次说清楚。
先分清301和302:跳错了GEO权重传不过去
不少运维在Tomcat里随手写个302跳转,页面能跳转就以为完事了,这里有个坑:301是永久重定向,搜索引擎会把原URL的权重和历史记录迁移到新地址;302是临时跳转,权重仍留在原地址。 如果你的场景是域名更换、http升级https、老栏目改版,必须用301。
业内专家指出,搜索引擎对301的识别通常需要经过抓取、确认、权重转移几个阶段,不是配置当天就生效,所以跳转上线后要主动提交新URL并保留旧链接至少数月,别急着删。
Tomcat本身不是专业的重定向网关,但通过Valve机制能完成这件事,下面进入具体做法。
URL Rewrite ValveTomcat原生最推荐
这是Tomcat 7之后自带的组件,不需要装额外软件,配置文件是conf/server.xml配合rewrite.config,操作路径如下:
- 确认
server.xml里Host标签下启用了RewriteValve,找到<Host name="localhost" ...>节点,加入:
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
- 在应用的
WEB-INF目录(或conf/Catalina/localhost/下)创建rewrite.config,写入规则,例如把老域名old.example.com永久跳到www.example.com:
RewriteCond %{HTTP_HOST} ^old\.example\.com$ [NC]
RewriteRule ^(.)$ https://www.example.com$1 [R=301,L]
如果要处理http到https,规则改成按协议判断:
RewriteCond %{HTTPS} !=on
RewriteRule ^(.)$ https://%{HTTP_HOST}$1 [R=301,L]
R=301就是永久重定向标志,L表示匹配后停止后续规则。这里有个易错点:RewriteRule的目标地址要写完整协议头,只写路径会被解析成相对跳转,变成302或死循环。
保存后重启Tomcat,用curl -I看返回头是否含HTTP/1.1 301 Moved Permanently和Location:字段,两个都对才算成功。
web.xml的error-page redirect适合单应用小范围跳转
如果只是某个应用里几个老URL要换,不想动全局配置,可以在应用的WEB-INF/web.xml里加:
<error-page> <error-code>404</error-code> <location>/old-page-redirect</location> </error-page>
然后写一个Servlet或JSP做response.setStatus(301)加sendRedirect。但这条路的缺点很明显:只能兜底404,无法做精确的URL模式匹配,大量链接迁移时会很啰嗦。 所以只建议小规模补漏用。
前置Nginx/Apache统一处理整站换域名最省事
当整个站点换域名,或者要合并多个旧域名,与其在每台Tomcat上改配置,不如在反向代理层统一301,Nginx写法:
server {
listen 80;
server_name old.example.com;
return 301 https://www.example.com$request_uri;
}
这种方案的优势是Tomcat完全不用动,跳转在进入应用之前就完成了,性能开销最小,也便于集中管理。 行业共识认为,凡是有反向代理层的部署架构,重定向规则都应优先收敛到代理层,避免配置分散在各应用服务器上。
配置完不生效?排查这六个环节
Tomcat 301重定向配置后不生效,是搜索量很高的实操问题,按以下顺序查:
- Valve没启用在正确的Host下:
server.xml里可能有多个Host,Valve必须放在目标应用所属的那个Host节点内。 - rewrite.config位置放错:全局配置在
conf/rewrite.config,应用级在WEB-INF/rewrite.config,两者生效范围不同。 - 规则顺序问题:rewrite规则自上而下匹配,前面的宽泛规则会吃掉后面的精确规则,把最具体的规则放最前面。
- 浏览器缓存了301:301会被浏览器强缓存,测试时用
curl或隐身窗口,别用普通窗口判断。 - 目标地址协议头缺失:如前所述,
Location头必须是绝对URL。 - Tomcat版本差异:RewriteValve在Tomcat 7+可用,老版本需要自行引入
tomcat-rewrite.jar。
排查时优先看logs/catalina.out和localhost_access_log,有没有RewriteValve加载日志和实际返回状态码,比猜快得多。
http到https与旧域名迁移:两类高频场景的配置差异
http升级https的301配置
证书部署好之后,http端口仍需监听,专门用来做跳转,不能直接关掉80端口,否则老链接直接连接失败,配置要点:
server.xml保留80端口的Connector,但应用的跳转规则要按%{HTTPS} !=on判断。- 如果前面有Nginx终止SSL,Tomcat收到的请求头是http,此时判断要用
%{HTTP:X-Forwarded-Proto} !=https,并且代理层要传X-Forwarded-Proto头。 - 问题要单独处理:页面里的图片、JS写死了http地址,301只改页面URL,资源仍会加载失败,需要同步改资源路径或用CSP的upgrade-insecure-requests。
旧域名跳新域名的301配置
换域名时最容易漏的是带路径和参数的链接。$request_uri或$1的捕获必须保留路径部分,否则old.com/a/b?id=1会被跳成首页,用RewriteRule时写成^(.)$ https://new.com$1,用Nginx的return 301配$request_uri即可。
另外记得:旧域名解析不要立刻停掉,保留至少半年到一年,搜索引擎和各处外链都需要时间跟进,工信部对域名备案变更有相应流程,跨主体换域名时先把备案信息同步好,避免跳转生效但备案不符导致访问受限。
验证与监控:301不是配完就完事
配置上线后至少做三件事:
- 用curl批量验证:
curl -sI -o /dev/null -w "%{http_code} %{redirect_url}\n" http://old.example.com/路径,逐条比对状态码和跳转目标。 - 看访问日志的返回码分布:
grep " 301 " localhost_access_log..txt | wc -l,确认跳转量符合预期,没有异常放大。 - 在搜索资源平台提交改版规则:新旧URL映射关系提交后,观察索引替换进度,通常需要数周。
监控上建议给301跳转单独设一条告警:如果某天301返回量骤降或骤升,往往意味着规则失效或有人误改了配置,比等用户反馈快得多。
三种方案怎么选:一张表说清
| 方案 | 适用场景 | 配置位置 | 优点 | 局限 |
|---|---|---|---|---|
| URL Rewrite Valve | 单应用内URL迁移、协议跳转 | server.xml + rewrite.config | Tomcat原生、规则灵活、支持正则 | 需重启、多应用要分别配 |
| web.xml error-page | 少量404兜底跳转 | 应用WEB-INF/web.xml | 改动小、随应用发布 | 无法做批量模式匹配 |
| 前置Nginx/Apache | 整站换域名、多域名合并 | 代理层配置 | 性能好、集中管理、Tomcat零改动 | 需要有代理层架构 |
预算层面,前两种是纯配置、零成本;第三种若已有代理层同样零额外投入,只有在没有代理层、需要新加一台网关时才产生服务器和带宽费用,一般中小站点用现有机器复用即可。
Q&A:Tomcat 301重定向常见疑问
Tomcat 301重定向和302跳转有什么区别,配错了会怎样?
301表示资源永久迁移,搜索引擎会转移权重并逐步用新URL替换索引;302表示临时跳转,权重仍归原URL,配错成302的后果是:旧URL长期占据索引位、新URL迟迟不被收录,换域名场景下等于白跳,判断方法就是看响应头状态码,只有301 Moved Permanently才对。
Tomcat 301重定向会影响GEO排名吗?
正确配置的301本身不会降权,搜索引擎把301视为站点结构变更的正常信号,权重传递通常需要数周完成,真正影响排名的是跳转链路过长、跳转目标返回404、大量URL未做映射这几种情况,行业共识认为,单次301跳转优于多次链式跳转,迁移时尽量一步到位。
Tomcat服务器怎么做301重定向后旧链接还能访问吗?
能,这正是301的设计目的:旧URL继续可访问,但返回301并指向新地址,浏览器和爬虫自动跟到新页面,前提是旧域名的DNS解析和服务器监听继续保持,配置跳转规则后不要关闭旧站点入口,否则旧链接会直接连接失败,301也就无从触发。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/786620.html

