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

dan*_*els 132 nginx http-headers

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

Bra*_*des 138

如果您使用nginx代理后端应用程序并希望后端在Server:没有nginx覆盖的情况下宣传自己的标头,那么您可以进入您的server {…}节并设置:

proxy_pass_header Server;
Run Code Online (Sandbox Code Playgroud)

这将说服nginx单独保留该标题,而不是重写后端设置的值.

  • 这种技术很容易解决问题. (16认同)
  • 如果由于安全原因而进行此更改,我不确定这是否足够.如果您的服务器需要返回错误消息,标题仍然是'nginx' (10认同)
  • 虽然这很容易解决问题但是有一点需要考虑:当使用反向代理时,静态文件通过nginx提供,因此当您在firebug网络面板中打开例如图像时,您仍然可以将服务器视为nginx (10认同)

jam*_*ell 74

最后一次更新是前一段时间,所以这就是我在Ubuntu上的作用:

sudo apt-get update
sudo apt-get install nginx-extras
Run Code Online (Sandbox Code Playgroud)

然后将以下两行添加到所述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!';
Run Code Online (Sandbox Code Playgroud)

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

  • 将空字符串设置为Server:将禁止服务器头:`more_set_headers'服务器:';` (5认同)
  • @PKHunter我没有用魔鬼的舌头尝试它,但我会看到我能找到的东西. (3认同)
  • **`sudo apt-get install nginx-extras`** 然后在 **nginx.conf** 中转到 http 部分并添加这两行 `server_tokens off; more_clear_headers 服务器;` (3认同)
  • YUM上有类似的东西吗?yum install nginx-extras不起作用. (2认同)
  • 这当然是最好的答案.应该被接受.这只是回答所有情况的一个. (2认同)
  • 为什么不只使用`more_clear_headers Server;`? (2认同)

joe*_*rdi 57

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

Server:string是一个标头,它被发送回客户端,告诉他们你正在运行什么类型的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;
Run Code Online (Sandbox Code Playgroud)

2011年3月编辑:道具弗拉菲乌斯低于指出一个新的选择,更换Nginx的标准HttpHeadersModule与叉形HttpHeadersMoreModule.重新编译标准模块仍然是快速修复,如果您想使用标准模块并且不会经常更改服务器字符串,则有意义.但是如果你想要更多,那么HttpHeadersMoreModule是一个强大的项目,可以让你用你的HTTP头做各种运行时黑魔法.

  • 这隐藏了版本号,但问题是"我知道我可以隐藏版本号,如何更改或删除整个'服务器'字符串?" 使用开箱即用的nginx无法做到这一点. (34认同)
  • 使用'server_tokens off;' 到目前为止是最简单的方法...确保将其放在"http"或"服务器"块中 (16认同)
  • 这个答案现在有点旧了.@jamescampbell的答案现在更加精确. (3认同)

Rui*_*ues 36

简单,编辑/etc/nginx/nginx.conf并删除评论

#server_tokens off;
Run Code Online (Sandbox Code Playgroud)

搜索http部分.

  • 该问题的作者已经知道此选项,该选项删除版本号,但不允许您自定义"server"标头中返回的值. (13认同)
  • 这并不会隐藏所有内容,只会隐藏服务器版本. (12认同)
  • 这很好用,一旦你这样做,你可以在标题信息上看到关于服务器的所有内容:nginx(没有版本号)谢谢!:d (3认同)
  • 不删除Server = nginx的响应头 (3认同)

Far*_*eed 35

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

server_tokens off;
more_set_headers 'Server: My Very Own Server';
Run Code Online (Sandbox Code Playgroud)

  • 如果我们要相信apt-get autoexpansion,那么最终会有一个带有"s"的nginx-extras (11认同)
  • 在Ubuntu上,您可以安装`nginx-extra`来获取该模块. (10认同)
  • 您必须使用第3方模块http://wiki.nginx.org/HttpHeadersMoreModule编译nginx (8认同)

Fla*_*ius 25

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

此模块允许您添加,设置或清除指定的任何输出或输入标题.

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

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

  • 使用`--add-module =/path-to-headers-more-nginx-module`编译nginx (3认同)

小智 17

安装Nginx Extras

sudo apt-get update
sudo apt-get install nginx-extras
Run Code Online (Sandbox Code Playgroud)

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

more_clear_headers Server;
server_tokens off;
Run Code Online (Sandbox Code Playgroud)


Par*_*hot 15

如果您只需将标题更改为另外五个字母或更少的字符串,则可以简单地修补二进制文件.

sed -i 's/nginx\r/thing\r/' `which nginx`
Run Code Online (Sandbox Code Playgroud)

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

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

我说"五个字母或更少",因为你当然可以取代:

nginx的\ r\0

鲍勃\ r\0\r\0

留下最后两个字节不变.

如果你真的想要超过五个字符,你会想要打开server_tokens,并替换(略长一点)格式字符串,尽管格式字符串的长度(1)对于该长度有一个上限(对于回车).

...如果上述任何一个对您没有意义,或者您之前从未打过二进制文件,那么您可能希望远离这种方法.

  • @PKHunter 嗯?这样做的优点是它可以*无需*从头开始编译。不涉及源代码。它直接修补编译后的*二进制文件*。 (2认同)
  • 它根本不知道文件格式 - 它只是用不同的字节序列替换字节序列 - 因此总是值得实际验证您要替换的字节序列是否确实只是您想要替换的字符串而不是,比如说,子例程中的可执行代码(这不太可能,但仍然如此)。 (2认同)

adr*_*rhc 6

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

\n\n
Syntax: server_tokens on | off | build | string;\n
Run Code Online (Sandbox Code Playgroud)\n\n

但遗憾的是只有商业订阅

\n\n
\n

此外,作为我们商业订阅的一部分,从版本 1.9.13 开始,错误页面上的签名和 \xe2\x80\x9cServer\xe2\x80\x9d 响应\n 标头字段值可以使用以下字符串显式设置: \n 变量。空字符串将禁用 \xe2\x80\x9cServer\xe2\x80\x9d\n 字段的发射。

\n
\n