HTTP/2本身不隐藏端口,端口隐藏依赖反向代理配置:严格限制后端端口仅内网访问、proxy_pass指向内网地址并正确处理路径与响应头、关闭server_tokens及敏感头、重写含端口的重定向。

HTTP/2 本身不参与端口隐藏,端口隐藏是反向代理的职责,和协议版本无关。Nginx 启用 HTTP/2(通常在 listen 443 ssl http2; 中配置)只是优化了客户端到 Nginx 的传输效率,不影响后端服务端口是否暴露。真正起作用的是 proxy_pass 的目标地址、防火墙策略和请求头处理。
要让真实后端端口完全不可见,关键不在 HTTP/2 配置,而在以下三个环节协同生效:
只开放 80/443,严格限制后端端口访问
- 后端服务(如
127.0.0.1:8001、192.168.5.10:3000)必须绑定内网地址或localhost,禁止监听0.0.0.0:端口 - 用系统防火墙(iptables/firewalld)或云平台安全组,彻底关闭所有后端端口对公网及非 Nginx 主机的入站访问
- 确保只有 Nginx 进程能通过本地回环或内网 IP 访问这些端口
用 location + proxy_pass 实现路径级抽象,不暴露端口信息
- 所有
proxy_pass必须指向内网地址+端口,但该端口不出现在任何对外 URL 或响应中:- ✅ 正确:
location /api/user/ { proxy_pass http://127.0.0.1:8001/; } - ❌ 错误:
location / { proxy_pass http://backend.example.com:8080; }(暴露域名和端口)
- ✅ 正确:
- 末尾
/必须保留,确保/api/user/profile被重写为/user/profile发往后端,避免路径泄露部署结构
清除或覆盖所有可能泄露端口/架构的响应头与重定向行为
- 关闭 Nginx 自身标识:
server_tokens off;(全局生效) - 屏蔽后端返回的敏感头:
-
proxy_hide_header Server; -
proxy_hide_header X-Powered-By; -
proxy_hide_header X-AspNet-Version;
-
- 处理后端发起的重定向(如 302):
-
proxy_redirect http://$host:8001/ /;(将后端含端口的 Location 重写为相对路径) - 或更通用:
proxy_redirect ~^http://[^/]+:(\d+)/(.*)$ /$2;
-
- 禁用
port_in_redirect on的副作用(仅影响 Nginx 主动重定向):在 server 块中设port_in_redirect off;,避免自身生成带端口的 Location
不复杂但容易忽略


















