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


141

有一个选项可以隐藏版本,使其仅显示nginx,但是也可以隐藏该版本,以使其不显示任何内容或更改标题吗?


34
顺便说一句,要隐藏nginx版本,您需要将“ server_tokens off”设置为off。
扬琴科

2
如果您想从标题中删除nginx,则可能还希望从重定向和错误页面中删除它。
fabianegli

Answers:


57

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

Server:字符串是标头,它被发送回客户端,以告诉他们您正在运行哪种类型的HTTP服务器以及可能的版本。诸如Alexia和Netcraft之类的地方使用此字符串来收集有关Internet上存在多少个和哪种类型的Web服务器的统计信息。为了支持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月编辑:道具弗拉菲乌斯低于指出一个新的选择,更换Nginx的标准HttpHeadersModule与叉形HttpHeadersMoreModule。重新编译标准模块仍然是快速解决方案,如果您要使用标准模块并且不会经常更改服务器字符串,则有意义。但是,如果您还想要更多,则HttpHeadersMoreModule是一个强大的项目,可让您使用HTTP标头进行各种运行时黑魔法。


18
使用'server_tokens off;' 是迄今为止最简单的方法...请确保将其放在“ http”或“服务器”块中
farinspace

35
这隐藏了版本号,但问题是“我知道我可以隐藏版本号,如何更改或删除整个'Server'字符串?” 使用现成的nginx无法做到这一点。
joelhardi 2011年

完全删除服务器标头的另一个快速解决方案(针对1.7.8版)是:注释掉第49和50行(与上面的第48、49行相对应),280-283和458-469。供以后参考:最后两个都是set的if块r->headers_out.server
pauluss86 2014年

3
这个答案现在有点老了。@jamescampbell的答案现在更加准确了。
jmcollin92 '16

如果您打算使用此方法来屏蔽服务器,则可能还需要编辑src / http / ngx_http_special_response.c文件以更改服务器的错误消息。
布罗根

143

如果您使用nginx代理后端应用程序,并且希望后端在Server:不通过nginx覆盖它的情况下公布其自己的标头,则可以进入server {…}节并进行以下设置:

proxy_pass_header Server;

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


11
如果出于安全原因进行此更改,则不确定是否足够。如果您的服务器需要返回错误消息,则标题仍为“ nginx”
KC Baltz 2014年

10
尽管这可以轻松解决问题,但是要考虑的一件事:使用反向代理时,静态文件是通过nginx提供的,因此,当您在firebug网络面板中打开例如image图像时,仍然可以看到服务器为nginx
戴夫2015年

海事组织,这是最好的答案。该解决方案不需要任何特殊的软件扩展,并且可以与基本的nginx一起使用。
克里斯(Kris)

81

最近的更新是前一阵子,所以这是在Ubuntu上对我有用的东西:

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

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

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

另外,不要忘记使用重启nginx sudo service nginx restart


2
YUM上有类似的东西吗?yum install nginx-extras无法正常工作。
PKHunter '16

3
@PKHunter我还没有用YUM的魔鬼舌头尝试过,但是我会发现我能找到的。
jamescampbell,2016年

2
这无疑是最好的答案。应该接受。这只是回答所有情况的一种。
jmcollin92 '16

6
将空字符串设置为Server:将取消服务器标头:more_set_headers 'Server: ';
Cody Craven

1
谢谢,这就像一个咒语,无需任何形式的重新编译。做得好;)
MitchellK

37

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

#server_tokens off;

搜索http部分。


3
这很好用,一旦完成所有操作,您就可以在标题信息上看到有关服务器的信息::nginx(无版本号)谢谢!:D
jacktrade

13
问题的作者已经知道此选项,该选项删除了版本号,但不允许您自定义在“服务器”标头中返回的值。
Makotosan

12
这不会隐藏所有内容,而只会隐藏服务器版本。
数字网站

3
不删除Server = nginx的响应标头
sasha

我认为通过nginx版本是一个安全问题。因此,对于许多人来说,这是一个“足够好”的解决方案。另外值得注意的是,这将不得不进入每个服务器块,如果你有端口80和443的服务器模块
杰里米

35

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

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

10
你有届党模块编译nginx的 wiki.nginx.org/HttpHeadersMoreModule
hostmaster

10
在Ubuntu上,您可以安装nginx-extra以获取该模块。
斯坦·邦迪2014年

11
如果我们相信apt-get自动扩展,那就是nginx-extras,末尾带有“ s”
Tjunkie 2014年

1
注意,您需要使用“ Server:”前缀来覆盖现有的Server:值。
elBradford

25

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

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

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

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


3
使用--add-module=/path-to-headers-more-nginx-module
mate64

看起来好像已经移到了OpenResty:github.com/openresty/headers-more-nginx-module#readme
Ben Creasy

有什么方法可以获取此模块而不必从Centos 7的源代码重新编译nginx吗?
Prachi

19

安装Nginx Extras

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

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

more_clear_headers Server;
server_tokens off;

一,这就是上面提到的@jamescampbell。其次,这需要从源代码编译Nginx(yum install nginx-extras不起作用-我想这可以在Debia / Ubuntu等上使用apt-get。)
Khom Nazid

它无需从源代码编译nginx就可以工作。您只需要加载模块:nginx.conf中的ngx_http_headers_more_filter_module
creekorful

运行“ apt-get install nginx-extras”后,它将我的nginx版本从1.16降级到1.14
grayaii 19'Aug

15

如果您可以将标头更改为另一个字符串(不超过五个字母),则可以简单地修补二进制文件。

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

作为解决方案,它具有一些显着的优点。也就是说,即使nginx-extras对您的发行版不可用,您也可以允许它由软件包管理器处理nginx版本(因此,无需从源代码进行编译),并且您无需担心任何其他问题像nginx-extras这样的代码容易受到攻击。

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

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

nginx \ r \ 0

bob \ r \ 0 \ r \ 0

保留最后两个字节不变。

如果您实际上希望使用五个以上的字符,则需要保留server_tokens并替换(稍长一些)格式字符串,尽管该长度又受格式字符串长度的限制-1(对于回车)。

...如果以上都不适合您,或者您以前从未修补过二进制文件,则可能要远离这种方法。


1
@PKHunter嗯?这样做的好处是无需重新编译即可运行。不涉及源代码。它直接修补已编译的二进制文件
Parthian Shot

1
它根本不了解文件格式-只是用不同的字节序列替换了字节序列-因此,始终值得一试的是,实际验证要替换的字节序列确实只是要替换的字符串,而不是,例如,子例程中的可执行代码(这是不太可能的,但仍然可以)。
Parthian Shot

1
因此,您只需在sed上面运行该命令,该`which nginx`部分将返回二进制文件的路径,然后该sed命令执行字节替换。
Parthian Shot

1
答案后面提到的空字节是指您可以使用比字符串的全长短的标头,只要您以空字节结束替换即可。en.wikipedia.org/wiki/Null-terminated_string
Parthian Shot

1
啊。是的,它是可执行文件。而且您还需要成为具有对该文件的写许可权的用户。如果您需要重新启动nginx以使更改生效,我也不会感到惊讶。说了什么 我敦促您不要使用其他答案之一。如果您不是很熟悉我所说的所有内容,并且您不知道/etc目录的用途,那么像这样的黑客是很危险的。
Parthian Shot '18

2

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

您可以在Nginx配置文件中执行的操作是将server_tokens设置为off。这将防止nginx打印版本号。

要检查情况,请尝试curl -I http://vurbu.com/ | grep服务器

它应该返回

Server: Hai

3
好吧,这不是唯一的方法。其他答复中也显示了其他替代方案。
Radko Dinev 2014年

1

在阅读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`

谢谢你 但是您在/usr/sbin文件夹内执行的第一个命令会产生以下结果:sed: can't read is: No such file or directory
Khom Nazid

1

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

Syntax: server_tokens on | off | build | string;

但可悲的是只有商业订阅

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


0

我知道这篇文章有点老了,但是我发现一种解决方案很容易,它可以在基于Debian的发行版上工作,而无需从源代码编译nginx。

首先安装nginx-extras软件包

sudo apt安装nginx-extras

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

load_module modules / ngx_http_headers_more_filter_module.so;

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


0

现在已弃用Nginx-extra软件包。

因此,当我尝试安装各种软件包more_set_headers'Server:My Very Own Server'时,以下内容现在对我有用。

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

    server_tokens '';

如果您只想删除版本号,则可以使用

   server_tokens off;

-4

您是否在询问有关服务器标头值的信息?您可以尝试使用add_header指令进行更改,但不确定是否可以使用。http://wiki.codemongers.com/NginxHttpHeadersModule


1
是的,服务器头。但是没有像在lighttpd上那样更干净的方法吗,例如我只有server.tag =“ whatever”?add_header仅适用于响应代码200、204、301、302或304,因此,如果服务器以某种方式执行500,则它将不起作用
丹尼尔斯,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.