初学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命令杀死原来的进程,再重新启动,