在 nginx 反向代理场景中,后端服务(如 apache、tomcat、node.js 等)常会在响应头中携带 server、x-powered-by 等字段暴露版本信息。使用 proxy_hide_header 指令可以在 nginx 层将其过滤掉。
为什么 proxy_hide_header server 通常不起作用
nginx 默认会将上游响应中的 server 头视为“受信响应头”,即使你写了 proxy_hide_header server,它仍可能被透传或被 nginx 自动重写。尤其当后端是标准 web 服务器(如 apache、tomcat)且未禁用自身 server 头时,nginx 的隐藏逻辑容易被绕过。
真正起效的方式是:让后端不发 server 头 + 让 nginx 不添加自己的 server 头 + 主动清除残留。
基础配置
在 location、server 或 http 块中添加:
location / {
proxy_pass http://backend;
# 隐藏后端 server 版本(如 apache/2.4.41、nginx/1.18.0 等)
proxy_hide_header server;
# 隐藏其他可能暴露技术栈的头部
proxy_hide_header x-powered-by;
proxy_hide_header x-aspnet-version;
proxy_hide_header x-runtime;
}完整安全加固示例
server {
listen 80;
server_name example.com;
# 1. 隐藏 nginx 自身版本号(响应头中只显示 "nginx" 而不显示版本)
server_tokens off;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header host $host;
proxy_set_header x-real-ip $remote_addr;
# 2. 隐藏后端暴露的头部
proxy_hide_header server;
proxy_hide_header x-powered-by;
# 3. 可选:添加安全响应头
add_header x-frame-options "sameorigin" always;
add_header x-content-type-options "nosniff" always;
}
}关键指令说明
| 指令 | 作用范围 | 说明 |
|---|---|---|
| proxy_hide_header server | 反向代理 | 移除后端返回的 server 头(如 apache/2.4.41) |
| server_tokens off | nginx 自身 | 隐藏 nginx 版本号,错误页面也不显示版本 |
| more_clear_headers server | nginx 自身 | 需要 headers-more-nginx-module 模块,可完全移除 server 头 |
注意事项
proxy_hide_header 只影响后端返回的头:如果要完全移除 nginx 自身的 server: nginx 头,需要安装第三方模块 headers-more-nginx-module:
more_clear_headers server;
检查是否生效:
curl -i http://example.com
确认响应头中不再包含 server 和 x-powered-by。
如果后端是 nginx:后端也需要配置 server_tokens off;,否则它会将带版本的 server 头传给前端 nginx。
这样配置后,响应头中的服务器版本信息就会被有效隐藏,减少被针对性扫描攻击的风险。
到此这篇关于nginx 配置 proxy_hide_header 隐藏后端 server 的版本信息的文章就介绍到这了,更多相关nginx 隐藏server版本信息内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论