如何更改由 nginx 返回的服务器标头?

有一个隐藏版本的选项,所以它将只显示 nginx,但是有一种方法来隐藏它也不会显示任何东西或改变标题?

210864 次浏览

您是否询问响应中的 Server 头值?您可以尝试使用 add _ header 指令修改它,但我不确定它是否有效。http://wiki.codemongers.com/NginxHttpHeadersModule

和 Apache 一样,这是对源代码的快速编辑和重新编译:

字符串是标题 被发送回客户端告诉 你是什么类型的 http 服务器 运行,可能什么版本。 此字符串用于 Alexia 和 Netcraft 来收账 数量和数量的统计数据 类型的网络服务器 支持作者和 我们推荐 Nginx 的统计数据 保持这根绳子原样。但是,为了 你可能不希望人们这么做 知道自己在做什么,你就能做到 在源代码中改变这一点。编辑 源文件 src/http/ngx_http_header_filter_module.c 看第48和49行,你可以 将 String 更改为任何值 想要。

## vi src/http/ngx_http_header_filter_module.c (lines 48 and 49)
static char ngx_http_server_string[] = "Server: MyDomain.com" CRLF;
static char ngx_http_server_full_string[] = "Server: MyDomain.com" CRLF;

2011年3月编辑: 支持 Flavius 指出一个新的选项,用分叉的 HttpHeadersMoreModule代替 Nginx 的标准 HttpHeadersModule。重新编译标准模块仍然是一个快速解决方案,如果您想要使用标准模块并且不会经常更改服务器字符串,那么重新编译标准模块仍然是有意义的。但是如果您想要更多,HttpHeadersMoreModule 是一个强大的项目,它允许您使用 HTTP 头进行各种运行时黑魔法。

唯一的方法是修改文件 src/http/ngx _ http _ header _ filter _ module.c。

可以在 nginx 配置文件中将 Server _ tokens 服务器 _ 令牌设置为 off。这将防止 nginx 打印版本号。

如果要检查,请尝试 Curl-i < a href = “ http://vurbu.com/”rel = “ nofollow norefrer”> http://vurbu.com/ | grep Server

它应该会回来的

Server: Hai

有一个特殊的模块: http://wiki.nginx.org/NginxHttpHeadersMoreModule

此模块允许您添加、设置或清除指定的任何输出或输入标头。

这是标准 标题模块的增强版,因为它提供了更多实用程序,如重置或清除“内置头”,如 Content-TypeContent-LengthServer

它还允许您使用 -s选项指定一个可选的 HTTP状态码标准,使用 -t选项指定一个可选的内容类型标准,同时使用 More _ set _ headers更清晰的标题指令修改输出头..。

Simple,编辑/etc/nginx/nginx.conf 并从中删除注释

#server_tokens off;

搜索 译注:部分。

如果你正在使用 nginx 代理一个后端应用程序,并且希望后端在不被 nginx 覆盖的情况下宣传它自己的 Server:头文件,那么你可以进入你的 server {…}节并设置:

proxy_pass_header Server;

这将说服 nginx 不去管那个头,而不重写后端设置的值。

很简单: 将这些行添加到服务器部分:

server_tokens off;
more_set_headers 'Server: My Very Own Server';

如果您可以只是将标题更改为另一个字符串5个字母或更少,您可以简单地修补二进制文件。

sed -i 's/nginx\r/thing\r/' `which nginx`

作为一种解决方案,它有一些显著的优势。也就是说,你可以让包管理器来处理你的 nginx 版本控制(所以,不能从源代码进行编译) ,即使你的发行版本不能使用 nginx 额外的代码,你也不需要担心任何额外的代码,比如 nginx 额外的代码会受到攻击。

当然,您还需要设置选项 server_tokens off,以隐藏版本号或修补该格式字符串。

我说“五个字母或更少”是因为你总是可以替换:

我们走吧

鲍勃

最后两个字节保持不变。

如果您实际上需要多于5个字符,则需要保留 server _ tokens,并替换(稍长的)格式字符串,尽管格式字符串 -1(用于回车)的长度对该长度也有一个上限。

... ... 如果以上这些对您来说都没有意义,或者您以前从未修补过二进制文件,那么您可能希望远离这种方法。

最后一次更新是在一段时间以前,所以下面是我在 Ubuntu 上的成功经验:

sudo apt-get update
sudo apt-get install nginx-extras

然后将以下两行添加到 nginx.confhttp部分,该部分通常位于/etc/nginx/nginx.conf:

sudo nano /etc/nginx/nginx.conf
server_tokens off; # removed pound sign
more_set_headers 'Server: Eff_You_Script_Kiddies!';

另外,不要忘记用 sudo service nginx restart重新启动 nginx。

安装额外的 Nginx

sudo apt-get update
sudo apt-get install nginx-extras

可以通过在 nginx.conf 中(http 部分下)添加以下两行来删除响应中的服务器详细信息

more_clear_headers Server;
server_tokens off;

在我读了 Parthian Shot 的答案之后,我深入研究了 /usr/sbin/nginx二进制文件。然后我发现这个文件包含这三行。

Server: nginx/1.12.2
Server: nginx/1.12.2
Server: nginx

基本上前两个是为 server_tokens on;指令设计的(包括服务器版本)。 然后更改搜索条件以匹配二进制文件中的那些行。

sed -i 's/Server: nginx/Server: thing/' `which nginx`

深入研究之后,我发现 nginx 生成的错误消息也包含在这个文件中。

<hr><center>nginx</center>

有三个版本,一个没有版本,其中两个包含了版本。因此,我运行以下命令来替换错误消息中的 nginx 字符串。

sed -i 's/center>nginx/center>thing/' `which nginx`

根据 nginx 文件,它支持自定义值甚至排除:

Syntax: server_tokens on | off | build | string;

但不幸的是只有 商业认购:

此外,作为我们商业订阅的一部分,从 版本1.9.13错误页面上的签名和“服务器”响应 头字段值可以使用 空字符串禁用“ Server”的发送 场地。

我知道这篇文章有点老,但我发现了一个简单的解决方案,可以在基于 Debian 的发行版上运行,而不需要从源代码编译 nginx。

第一个安装 nginx-extra 软件包

安装 nginx 额外功能

然后通过编辑 nginx.conf 并在服务器块中添加以下代码行来加载 nginx http 头的更多模块

Load _ module module/ngx _ http _ headers _ more _ filter _ module. so;

完成之后,您就可以访问 more _ set _ headers 和 more _ clear _ headers 指令。

现在不推荐使用 Nginx 额外的软件包。

因此,以下方法在我尝试安装各种软件包时确实对我有用 More _ set _ headers‘ Server: My Very Own Server’;

您只需执行以下操作,就不会发回任何服务器或版本信息

    server_tokens '';

如果您只是想删除这个工作的版本号

   server_tokens off;

扩展到 Parthian Shot 的答案,你实际上可以替换整个头部,而不仅仅是值,只要总长度是相同的:

sed -i 's/Server: nginx/My-Header: hi/' `which nginx`