Answers:
您可以通过添加以下命令停止输出Nginx和OS的版本
server_tokens off;
到http
,server
或location
上下文。
或者,如果您想完全删除Server标头,则需要使用Headers More模块编译Nginx,因为标头在Nginx源代码中是硬编码的,并且该模块允许更改任何http标头。
more_clear_headers Server;
但是,服务器有许多隐藏的方式,通过它们的实现来意外执行,这可能有助于识别系统。例如,它如何响应错误的SSL请求。我没有防止这种情况的实用方法。
我可能会建议一些事情:
如果您已在Debian或Ubuntu中使用apt-get安装了nginx,则可能需要安装软件包nginx-extras来设置或清除“服务器”标头
完成此操作后,您可以在nginx.conf(通常是/etc/nginx/nginx.conf)中添加以下行:
要完全清除“服务器”标头:
more_clear_headers Server;
要将自定义字符串设置为“服务器”
more_set_headers 'Server: some-string-here';
more_clear_headers Server;
在Debian Jessie 8.5 nginx版本上的工作原理:nginx / 1.6.2
sudo apt-get install nginx-extras
然后设置标题
unknown directive "more_set_headers"
。通过在中显式启用模块来解决该问题/etc/nginx/nginx.conf
。只需load_module modules/ngx_http_headers_more_filter_module.so;
在配置文件的开头添加即可 。
@Martin F.是的。您将必须从源代码进行编译,并在编译源代码之前更改所需的内容。
我假设您下载了最后一个稳定的版本,并将其解压缩,然后知道文件在哪里。如果是这种情况,请执行以下操作:
nano src/http/ngx_http_header_filter_module.c
如果我没记错的话,然后寻找第48行。
static char ngx_http_server_string[] = "Server: nginx" CRLF;
用MyWhateverServerNameIWant替换nginx例如
static char ngx_http_server_string[] = "Server: MyWhateverServerNameIWant" CRLF;
然后
nano src/core/nginx.h
寻找线
#define NGINX_VER "nginx/" NGINX_VERSION
将“ nginx /”更改为“ MyWhateverServerNameIWant /”,以便读取
#define NGINX_VER "MyWhateverServerNameIWant" NGINX_VERSION
最后,如果您还要更改版本号
寻找行#define NGINX_VERSION“ 1.0.4”
然后将“ 1.0.4”更改为所需的任何版本。例如它将读取
#define NGINX_VERSION "5.5.5"
希望能帮助到你。尽管如此。保护服务器的安全性远远超出了不显示正在运行的内容的范围。PHP本质上是不安全的,Linux也是如此。当然,如果采取所有必要措施以实现良好的安全性,Linux可能会相当安全。就PHP而言,我建议使用Suoshin来增强代码的安全性。
在花了很多时间研究如何在ubuntu上自定义nginx风格后,我意识到您可以为此使用lua模块。
在ubuntu 14.04上,如果安装nginx-extras
软件包,则可以使用以下方法删除服务器头:
header_filter_by_lua 'ngx.header["server"] = nil';
将其扔到http块中,每个请求都将缺少Server
标题。
如果不起作用nginx -V
,请运行以验证是否已将lua模块编译到nginx副本中。如果没有,您可能会使用替代软件包来获取它。
nginx-extra
成功了more_set_headers "Server: whatever";
,所以+1:D
建议使用新指令header_filter_by_lua_block代替header_filter_by_lua,该指令直接在花括号()之间内嵌 Lua源{}
。这样就不需要转义特殊字符。
header_filter_by_lua_block {
ngx.header["server"] = nil
}
https://github.com/openresty/lua-nginx-module#header_filter_by_lua_block
首先,为什么要使用额外的模块作为Headers More Nginx?仅隐藏服务器标头。如果几行,简单的补丁程序可以为您达到相同的解决方案。
由于使用额外的模块可能会导致不稳定(已在您的环境中对其进行了良好的测试?与其他模块等一起进行了测试)或不安全(此模块是否定期通过错误和/或与安全相关的修复程序进行更新?)
其次。此线程作为答复279389描述了如何调整Nginx代码以更改服务器头。问题是他们忘记了HTTP / 2。简而言之,什么都不会改变。服务器标头仍将可见。
少即是多。好的,我承认,我也一直在寻找一种好的解决方案。但最后发现:
我终于从那个烦人的Nginx服务器头中赎回了。
在Nginx源代码文件夹中运行此bash函数。在nginx- $ version中,不在src /中。
基于这个答案。
hidengxver () {
read -r -p "Your own http_server_string for safety: " http_server_string
first_string="static char ngx_http_server_string\[\] = \"Server: nginx\" CRLF;"
second_string="static char ngx_http_server_string\[\] = \"$http_server_string\" CRLF;"
sed -ire "s/$first_string/$second_string/g" src/http/ngx_http_header_filter_module.c
read -r -p "Your own NGINX_VER const: " nginx_ver
third_string="\#define NGINX\_VER \"nginx\/\" NGINX\_VERSION"
forth_string="\#define NGINX\_VER \"$nginx_ver\" NGINX\_VERSION"
sed -ire "s/$third_string/$forth_string/g" src/core/nginx.h
real_nginx_version=$( grep '#define NGINX_VERSION' src/core/nginx.h | gawk -F'"' '{print $2}' )
read -r -p "Your own NGINX_VERSION const: " new_nginx_version
fifth_string="\#define NGINX\_VERSION \"$real_nginx_version\""
sixth_string="\#define NGINX\_VERSION \"$new_nginx_version\""
sed -ire "s/$fifth_string/$sixth_string/g" src/core/nginx.h
}