nginx 隐藏后端端口靠反向代理(proxy_pass)而非 url 重写,rewrite 仅辅助路径标准化;通过 location 映射、防火墙隔离、响应头清理等组合实现端口完全隐藏。

Nginx 中 URL 重写本身不直接“隐藏端口”,真正隐藏后端端口靠的是反向代理(proxy_pass)+ 路径映射 + 端口隔离。URL 重写(rewrite)在此过程中起的是辅助作用:把用户看到的干净路径,转换成 Nginx 内部能正确转发给后端服务的格式,同时确保原始端口、IP、目录结构对客户端完全不可见。
核心逻辑是:用户只访问 https://example.com/api/user,Nginx 把它内部处理为 http://127.0.0.1:8080/v2/users(或任意非标端口),整个过程浏览器地址栏不变、无跳转、不暴露任何后端细节。
以下是关键配置要点:
1. 用 location + proxy_pass 实现端口隐藏(主干)
不依赖 rewrite,而是通过路径前缀直接映射到内网服务:
location /api/ {
proxy_pass http://127.0.0.1:8080/; # 注意末尾斜杠:自动剥离 /api/ 并拼接
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;
}
✅ 效果:/api/user → 后端收到 /user,端口 8080 完全不暴露在 URL 中。
2. 用 rewrite 做路径标准化(可选但常用)
当后端接口路径不统一,或需兼容旧版 URL 时,用 rewrite 统一规整:
# 把 /v1/user → 内部转为 /api/v1/user,再由上面 location 处理 rewrite ^/v1/(.+)$ /api/v1/$1 break; # 或把带版本号的请求统一降级到 v2(后端实际只认 /v2) rewrite ^/user/(.+)$ /v2/user/$1 break;
⚠️ 注意:这里用 break(不是 last),避免重复匹配 location;且 rewrite 必须放在对应 location 块内,或 server 块顶部按需生效。
3. 彻底阻断对真实端口的直连访问
仅靠 Nginx 配置不够,必须配合系统层防护:
- 关闭后端服务的公网监听(如
spring boot设为server.address=127.0.0.1) - 用防火墙(iptables / ufw)或云安全组禁止除
127.0.0.1外的所有 IP 访问8080端口 - 在后端代码中校验
X-Forwarded-For或自定义 header(如X-Proxy-By: nginx),拒绝未带该头的请求
4. 清除暴露后端信息的响应头
防止后端返回的敏感头泄露架构:
proxy_hide_header X-Powered-By; proxy_hide_header Server; proxy_hide_header X-AspNet-Version; # 全局关闭 Nginx 自身版本 server_tokens off;
不复杂但容易忽略











