外网访问打不开?3种场景根治端口转发丢端口
外网访问打不开?3种场景根治端口转发丢端口原创:凯哥Java本文标签:路由器端口转发丢端口、SpringBoot重定向端口、TomcatproxyPort配置前两天一兄弟在群里喊:凯哥,我这在路由器上做了端口转发,外网访问http://公网IP:17080/项目名死活打不开,浏览器直接报无法连接。他第一反应就是路由器坏了、转发没配好。我让他先别动路由器。这种「一访问就跳转到没端口的地址、然后打不开
外网访问打不开?3种场景根治端口转发丢端口
原创:凯哥Java
本文标签:路由器端口转发丢端口、SpringBoot重定向端口、Tomcat proxyPort配置
前两天一兄弟在群里喊:凯哥,我这在路由器上做了端口转发,外网访问 http://公网IP:17080/项目名 死活打不开,浏览器直接报无法连接。他第一反应就是路由器坏了、转发没配好。
我让他先别动路由器。这种「一访问就跳转到没端口的地址、然后打不开」的现象,我见得太多了——锅大概率不在路由器,在你后端那个 Web 应用身上。
摘要内容:外网访问端口转发地址打不开,常见原因是后端 Tomcat/SpringBoot 返回了不带公网端口的 301/302 重定向;路由器四层 NAT 不会改写 Location 头。本文给出 3 种场景的永久修复方案,含 SpringBoot、原生 Tomcat 与代码层写法。

一、先说结论:锅不在路由器,在你后端应用
先把现象还原一遍,你就明白了。
你在外网访问:
http://1.2.3.4:17080/your-app (末尾没加斜杠)
应用自己「啪」一下给你 301 跳转到:
http://1.2.3.4/your-app/ (:17080 没了)
浏览器拿到这个没有端口的地址,HTTP 默认走 80 端口,结果就是去敲 80——你内网服务又没监听 80,自然打不开。
🔥 重点来了:没有 Nginx、纯路由器端口转发的情况下,路由器本身不会主动去改 HTTP 的 Location 重定向头。端口之所以丢,100% 是你后端 Web 应用(Tomcat 或 SpringBoot 内置 Tomcat)自己吐了一个不带端口的 301/302。
想确认?在外网机器上敲一条命令看返回的 Location:
curl -I http://1.2.3.4:17080/your-app
你大概率会看到:
HTTP/1.1 301 Moved Permanently
Location: http://1.2.3.4/your-app/
下面这张是凯哥在外网机器上实际跑出来的响应头——Location 后面只跟了 IP,根本没带 17
原创不易,完成人机校验,阅读全文
相关推荐
工作小总结&小工具类ChatGPT Windows 客户端突然打不开?提示找不到 Codex CLI,我这样解决了工作小总结【卧槽】在使用idea创建spring boot项目的时候,提示打不开start.spring.io的解决办法 Initialization failed for ‘https://start.spring.io’ Please check URL, network and proxy settings工作小总结怎么在Nginx上配置FRP支持任意端口呢?(访问的时候,需要添加端口号)工作小总结eclipse中web项目怎么直接端口,不加项目名称访问?工作小总结centos下frp和nginx实现公用80端口进行微信公众号开发及不带端口访问502解决方案FRPfrp配置多端口内网穿透?frp多端口怎么配置?REDISRedis常见数据结构使用场景CHATGPTChatGPT的应用场景:开启无限可能的大门