直接改源码是目前唯一能彻底自定义server响应头名称的方法,nginx 1.19.7+禁止配置或模块覆盖该头;需同步修改nginx.h、ngx_http_header_filter_module.c、ngx_http_special_response.c及ngx_http_v2_filter_module.c四文件中的硬编码字符串,再编译安装并验证。

直接改源码是目前唯一能彻底自定义 Server 响应头名称的方法,Nginx 1.19.7 及之后版本已从内核层禁止通过配置或第三方模块(如 headers-more)覆盖 Server 头,所有 more_set_headers 'Server: xxx' 或 add_header Server xxx 在主服务中均无效且静默忽略。
需要修改的4处源码位置
以 Nginx 1.25.4 为例(其他 ≥1.19.7 版本结构类似),必须同步修改以下文件中的硬编码字符串:
-
src/core/nginx.h:修改NGINX_VER(如改为"MyCDN/2.0")、NGINX_VAR(如"MyCDN"),影响版本标识和内部变量名 -
src/http/ngx_http_header_filter_module.c:找到三处ngx_http_server_*数组,将"Server: nginx"、"Server: " NGINX_VER CRLF等全部替换为你想要的字符串,例如"Server: MyCDN" CRLF -
src/http/ngx_http_special_response.c:搜索错误页模板中的<center>nginx</center>,替换成<center>MyCDN</center>,避免 4xx/5xx 页面泄露原始标识 -
src/http/v2/ngx_http_v2_filter_module.c(若启用 HTTP/2):查找"server: nginx"字符串并替换,否则 HTTP/2 响应中仍会暴露默认值
编译与验证流程
修改完成后,按标准编译流程操作:
- 执行
./configure --prefix=/usr/local/nginx [其他所需模块选项](建议关闭不必要模块,提升安全性) - 运行
make && sudo make install - 确保旧进程已停用:
sudo /usr/local/nginx/sbin/nginx -s stop,再启动新版本 - 用
curl -I http://your-domain检查响应头,确认Server字段已更新;同时访问一个不存在路径(如/xxx)验证错误页中也不含原始标识
配套安全建议
仅改 Server 头不够,还需组合其他防护措施防扫描:
- 在
http块中添加server_tokens off;——虽对自定义名无影响,但可防止误配导致版本号二次泄露 - 禁用非必要 HTTP 方法:
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$) { return 405; } - 配合限流模块(如
limit_req)限制单 IP 请求频率,增加自动化扫描成本 - 前端部署反向代理(如 Cloudflare 或另一台 Nginx)作首层入口,真实后端 Server 头可完全隐藏,仅由边缘层输出自定义值
这种方式不依赖运行时模块,修改一次即长期生效,但每次升级 Nginx 都需重新打补丁并编译。它不是“混淆”,而是真正替换——攻击者扫到的不再是 nginx,而是你指定的任意名称,降低被定向利用已知漏洞的风险。











