153

有一个隐藏版本的选项,因此它只会显示 nginx,但是有没有办法隐藏它,所以它不会显示任何内容或更改标题?

4

14 回答 14

159

如果您正在使用 nginx 代理后端应用程序并希望后端广告自己的Server:标头而不被 nginx 覆盖,那么您可以进入您的server {…}节内部并设置:

proxy_pass_header Server;

这将说服 nginx 不理会该标头,而不是重写后端设置的值。

于 2012-02-12T22:08:16.647 回答
106

上次更新是在不久前,所以这对我来说在 Ubuntu 上有用:

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

然后将以下两行添加到通常位于 /etc/nginx/nginx.conf的http部分中: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.

于 2015-11-04T04:27:15.307 回答
60

与 Apache 一样,这是对源代码的快速编辑并重新编译。来自Calomel.org

Server: 字符串是发送回客户端的标头,以告诉他们您正在运行什么类型的 http 服务器以及可能是什么版本。Alexia 和 Netcraft 等地方使用此字符串来收集有关 Internet 上存在的 Web 服务器数量和类型的统计信息。为了支持 Nginx 的作者和统计信息,我们建议保持此字符串不变。但是,为了安全起见,您可能不希望人们知道您正在运行什么,您可以在源代码中进行更改。编辑源文件 src/http/ngx_http_header_filter_module.c ,查看第 48 和 49 行。您可以将字符串更改为您想要的任何内容。

## 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 标头执行各种运行时黑魔法。

于 2008-10-29T10:04:42.693 回答
40

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

server_tokens off;
more_set_headers 'Server: My Very Own Server';
于 2014-05-11T06:36:20.037 回答
36

简单,编辑 /etc/nginx/nginx.conf 并删除注释

#server_tokens off;

搜索http部分。

于 2011-11-15T15:51:54.090 回答
28

安装 Nginx 附加功能

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

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

more_clear_headers Server;
server_tokens off;
于 2017-06-02T09:34:30.653 回答
25

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

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

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

它还允许您使用该选项指定可选的 HTTP 状态代码标准,-s并使用该选项指定可选的内容类型标准,同时使用more_set_headersmore_clear_headers指令-t修改输出标头...

于 2010-02-17T12:24:19.920 回答
16

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

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

作为一种解决方案,它具有一些显着的优势。也就是说,即使 nginx-extras 不适用于您的发行版,您也可以允许包管理器处理您的 nginx 版本控制(因此,不从源代码编译),并且您无需担心任何额外的像 nginx-extras 这样的代码易受攻击。

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

我说“五个字母或更少”,因为您当然可以随时替换:

nginx\r\0

鲍勃\r\0\r\0

保持最后两个字节不变。

如果您实际上需要五个以上的字符,则需要保留 server_tokens 并替换(稍长)格式字符串,尽管格式字符串的长度再次对该长度施加了上限 - 1(对于回车)。

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

于 2015-04-26T18:16:44.383 回答
4

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

Syntax: server_tokens on | off | build | string;

但遗憾的是只有商业订阅

此外,作为我们商业订阅的一部分,从版本 1.9.13 开始,错误页面上的签名和“服务器”响应头字段值可以使用带有变量的字符串显式设置。空字符串禁用“服务器”字段的发射。

于 2019-05-02T12:12:24.867 回答
2

唯一的方法是修改文件 src/http/ngx_http_header_filter_module.c 。我将第 48 行的 nginx 更改为不同的字符串。

您可以在 nginx 配置文件中将server_tokens设置为关闭。这将阻止 nginx 打印版本号。

要检查一下,试试curl -I http://vurbu.com/ | grep 服务器

它应该返回

Server: Hai
于 2009-04-08T11:19:46.873 回答
2

在阅读了 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`
于 2018-08-08T12:32:16.773 回答
2

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

首先安装 nginx-extras 包

sudo apt install nginx-extras

然后通过编辑 nginx.conf 并在 server 块中添加以下行来加载 nginx http headers more 模块

load_module 模块/ngx_http_headers_more_filter_module.so;

完成后,您将可以访问 more_set_headers 和 more_clear_headers 指令。

于 2019-06-21T13:11:09.850 回答
0

Nginx-extra 包现在已弃用。

因此,以下内容现在对我有用,因为我尝试安装各种包 more_set_headers 'Server: My Very Own Server';

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

    server_tokens '';

如果您只想删除版本号,这可行

   server_tokens off;
于 2020-05-06T06:09:12.567 回答
-4

您是在询问响应中的 Server 标头值吗?您可以尝试使用 add_header 指令更改它,但我不确定它是否会起作用。http://wiki.codemongers.com/NginxHttpHeadersModule

于 2008-10-29T09:48:00.840 回答