Nginx 隐藏服务器名称和版本号

初学nginx,遇到了server_tokens命令,该命令的作用是显示或隐藏掉版本号。

例如server_tokens off; 隐藏版本号。浏览器访问时抓包,查看HTTP响应的Server头没有版本号。

既然版本号可以隐藏,那可不可以隐藏或修改nginx服务器的名称呢?答案是可以,修改或隐藏服务器名称需要修改源码nginx.h,nginx.h在src/core/目录下 。具体操作如下:

下面两个宏的值修改为自己设定的值,例如"NGX"。 都改为 "" 即隐藏名称。

#define NGINX_VER         "nginx/" NGINX_VERSION   改为 #define NGINX_VER          "NGX" NGINX_VERSION
#define NGINX_VAR          "NGINX" 改为 #define NGINX_VAR          "NGX"

同理改版本号修改NGINX_VERSION的值

#define NGINX_VERSION      "1.8.0"

注意事项

1. 在配置文件nginx.conf中不要使用server_tokens  off命令, 因为如果设置了该命令,服务器名称就固定了。

如果配置了server_tokens off,在解析文件时 clcf->server_tokens值为0。见ngx_http_core_module.c 的server_token命令处理函数ngx_conf_set_flag_slot

if (ngx_strcasecmp(value[1].data, (u_char *) "on") == 0) {
    *fp = 1;

} else if (ngx_strcasecmp(value[1].data, (u_char *) "off") == 0) {
    *fp = 0;
}

而在ngx_http_header_filter_module.c中

static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;


if (clcf->server_tokens) {
	p = (u_char *) ngx_http_server_full_string;
	len = sizeof(ngx_http_server_full_string) - 1;
} else {
	p = (u_char *) ngx_http_server_string;
        len = sizeof(ngx_http_server_string) - 1;
}
 

2. 程序重新编译完后,要reload不会生效,需要用kill命令杀死原来的进程,再重新启动,

相关文章
相关标签/搜索