Nginx 中需在 location 块内、proxy_pass 后逐行配置 proxy_hide_header 隐藏 Server、X-Powered-By 等敏感头,并配合 server_tokens off 和 proxy_set_header Server "" 彻底清除 Server 头,最后用 curl -I 验证生效。

直接在 Nginx 的 location 块中写 proxy_hide_header 指令,配合 proxy_pass 使用,就能移除后端返回的敏感响应头。关键不是“怎么加”,而是“加在哪、加哪些、怎么验证”。
必须隐藏的敏感 Header 列表
这些头常见于 Spring Boot、Express、PHP、ASP.NET、Tomcat 等后端,暴露技术栈和版本,是攻击者侦察的第一目标:
-
Server:后端真实服务器标识(如
Apache/2.4.52、uvicorn、nginx/1.22.1) -
X-Powered-By:框架语言信息(如
Express、PHP/8.2、Spring Boot/3.2.0) -
X-Application-Context:Spring Boot 默认返回,含 profile 名称(如
application:prod) - X-AspNet-Version / X-AspNetMvc-Version:.NET 应用特有,指向具体框架版本
- X-Debug-Token / X-Runtime:暴露调试开关或请求耗时,辅助自动化扫描
配置位置和写法规范
这个指令非常“娇气”,位置错、顺序错、范围错,就完全不生效:
- 必须放在
proxy_pass之后,否则 Nginx 直接忽略 - 只在当前
location或server块内有效,http块里写的不会继承到子块 - 每个头必须单独一行,不支持逗号分隔或通配符(不能写
proxy_hide_header Server X-Powered-By) - 大小写不敏感,但建议按标准首字母大写(如
Server),避免维护歧义 - 若后端返回多个同名头(如两个
X-Trace-ID),会一并移除
推荐的静态资源专用配置
JS、CSS、图片等静态文件不依赖后端响应头,最适合集中清理。以下配置可直接复用:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot)$ {
proxy_pass http://static_backend;
proxy_hide_header Server;
proxy_hide_header X-Powered-By;
proxy_hide_header X-AspNet-Version;
proxy_hide_header X-Application-Context;
proxy_hide_header X-Debug-Token;
<pre class="brush:php;toolbar:false;"># 同步加固:添加基础安全头
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;}
彻底清除 Server 头的三步法
单靠 proxy_hide_header Server 往往不够——Nginx 对 Server 头有特殊处理逻辑,错误页、重定向等场景容易漏掉。真正可靠的做法是三者协同:
- 关闭 Nginx 自身版本输出:
server_tokens off;(推荐放在http块,全局生效) - 屏蔽后端透传的
Server:proxy_hide_header Server;(写在location内、proxy_pass后) - 强制清空残留值:
proxy_set_header Server "";(同一location中,覆盖可能被自动补上的值)
验证是否生效的实操方法
别只信配置文件,必须通过真实请求确认:
- 用
curl -I https://example.com/main.js查看响应头,确认目标字段已消失 - 浏览器打开开发者工具 → Network → 点击任意静态资源 → Headers → Response Headers
- 若仍存在,检查三项:
– 是否执行了nginx -s reload重载配置
– 是否匹配到了正确的location(可用nginx -T查看完整生效配置)
– 后端是否在错误页面中硬编码了版本(如 Spring Boot 白页显示 Spring Boot 版本),此时需改应用层











