工作小总结&小工具类

外网访问打不开?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

原创不易,完成人机校验,阅读全文

相关推荐