Windows环境下Spring Boot内嵌Tomcat配置VirtualHost实现域名访问不跳转IP端口
问题核心原因
- 域名默认解析后访问的是服务器80(HTTP)/443(HTTPS)端口,你的Spring Boot服务运行在54654非标准端口,未做端口映射和域名绑定的情况下,访问域名要么自动跳转IP+端口,要么只能通过iframe套壳的隐性转发保留域名,就是你之前遇到的嵌套问题。
- 修改hosts文件仅负责域名到IP的本地解析,不处理端口映射和服务端重定向逻辑,因此不会生效。
可实现需求的两种方案
方案1:仅通过Spring Boot配置实现(单域名绑定场景适用)
可以通过application.properties配置完成,不需要额外修改Tomcat虚拟主机设置,操作步骤如下:
- 若服务器80端口未被其他站点占用,直接将Spring Boot端口改为80,同时配置域名绑定即可:
# 服务端口改为80,域名访问时不需要加端口 server.port=80 # 绑定对应域名,重定向时强制使用该域名,替换为你自己的域名 spring.server.name=www.abc.com # 关闭相对重定向,避免生成IP地址的跳转链接 server.tomcat.use-relative-redirects=false
- 若80端口被占用,保留原端口54654,修改配置如下:
server.port=54654 spring.server.name=www.abc.com # 开启转发头识别,读取请求的真实域名而非本地IP server.use-forward-headers=true server.tomcat.remoteip.host-header=x-forwarded-host server.tomcat.remoteip.protocol-header=x-forwarded-proto server.tomcat.use-relative-redirects=false
然后在Windows服务器上用管理员权限打开CMD,执行端口转发命令,将公网80端口收到的请求转发到本地54654端口:netsh interface portproxy add v4tov4 listenaddress=你的服务器公网IP listenport=80 connectaddress=127.0.0.1 connectport=54654
注意:该方案仅适用于80端口只有你这一个域名使用的场景,多站点共存请用方案2
方案2:配置Nginx反向代理(多站点共存场景推荐)
不需要修改Spring Boot的任何配置,用Nginx监听80端口,根据不同域名转发到对应服务端口,完美适配多站点共存的场景:
- 下载Windows版本的Nginx,解压后修改配置文件
conf/nginx.conf,新增如下server块:
server { listen 80; server_name www.abc.com; # 替换为你的域名 location / { # 转发到本地Spring Boot服务端口 proxy_pass http://127.0.0.1:54654; # 传递真实请求域名给后端服务 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 禁止后端返回IP地址的重定向 proxy_redirect off; } }
- 启动Nginx即可,后续所有域名访问都会走Nginx转发,地址栏全程保留域名,不会跳转IP+端口,也不会影响服务器上其他站点的原有访问规则。
排查注意事项
- 配置完成后清空浏览器缓存再测试,避免旧的301/302重定向缓存影响结果
- 确认域名解析的A记录直接指向服务器公网IP,未开启CDN、隐性转发等中间服务
- 服务器安全组/防火墙需开放80、443端口的入站规则
内容的提问来源于stack exchange,提问作者Abishek Stephen
相关产品推荐
相关产品推荐

