修改src/http/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;
将其修改为:
static char ngx_http_server_string[] = "Server: Microsoft-IIS/7.5
" CRLF;
static char ngx_http_server_full_string[] = "Server: Microsoft-IIS/7.5
" CRLF;
一. 介绍ngx_headers_more
ngx_headers_more 用于添加、设置和清除输入和输出的头信息。nginx源码没有包含该模块,需要另行添加。
该模块是ngx_http_headers_module模块的增强版,提供了更多的实用工具,比如复位或清除内置头信息,如Content-Type, Content-Length, 和Server。
可以允许你使用-s选项指定HTTP状态码,使用-t选项指定内容类型,通过more_set_headers 和 more_clear_headers 指令来修改输出头信息。如:
1
|
more_set_headers
-
s
404
-
t
'text/html'
'X-Foo: Bar'
;
|
输入头信息也可以这么修改,如:
1
2
3
4
5
|
location
/
foo
{
more_set_input
_headers
'Host: foo'
'User-Agent: faked'
;
# now $host, $http_host, $user_agent, and
# $http_user_agent all have their new values.
}
|
-t选项也可以在more_set_input_headers和more_clear_input_headers指令中使用。
不像标准头模块,该模块的指示适用于所有的状态码,包括4xx和5xx的。 add_header只适用于200,201,204,206,301,302,303,304,或307。
标准头模块ngx_http_headers_module参见:《ngx_http_headers_module模块add_header和expires指令》
二. 安装ngx_headers_more
1
2
3
4
5
6
7
8
9
10
|
wget
'http://nginx.org/download/nginx-1.5.8.tar.gz'
tar
-
xzvf
nginx
-
1.5.8.tar.gz
cd
nginx
-
1.5.8
/
# Here we assume you would install you nginx under /opt/nginx/.
.
/
configure
--
prefix
=
/
opt
/
nginx
\
--
add
-
module
=
/
path
/
to
/
headers
-
more
-
nginx
-
module
make
make
install
|
ngx_headers_more 包下载地址:http://github.com/agentzh/headers-more-nginx-module/tags
ngx_openresty包含该模块。
三. 指令说明
more_set_headers
语法:more_set_headers [-t <content-type list>]... [-s <status-code list>]... <new-header>...
默认值:no
配置段:http, server, location, location if
阶段:输出报头过滤器
替换(如有)或增加(如果不是所有)指定的输出头时响应状态代码与-s选项相匹配和响应的内容类型的-t选项指定的类型相匹配的。
如果没有指定-s或-t,或有一个空表值,无需匹配。因此,对于下面的指定,任何状态码和任何内容类型都讲设置。
1
|
more_set
_headers
"Server: my_server"
;
|
具有相同名称的响应头总是覆盖。如果要添加头,可以使用标准的add_header指令代替。
单个指令可以设置/添加多个输出头。如:
1
|
more_set
_headers
'Foo: bar'
'Baz: bah'
;
|
在单一指令中,选项可以多次出现,如:
1
|
more_set_headers
-
s
404
-
s
'500 503'
'Foo: bar'
;
|
等同于:
1
|
more_set_headers
-
s
'404 500 503'
'Foo: bar'
;
|
新的头是下面形式之一:
Name: Value
Name:
Name
最后两个有效清除的头名称的值。Nginx的变量允许是头值,如:
1
2
|
set
$
my
_var
"dog"
;
more_set
_headers
"Server: $my_var"
;
|
注意:more_set_headers允许在location的if块中,但不允许在server的if块中。下面的配置就报语法错误:
1
2
3
4
5
6
7
|
# This is NOT allowed!
server
{
if
(
$
args
~
'download'
)
{
more_set
_headers
'Foo: Bar'
;
}
.
.
.
}
|
more_clear_headers
语法:more_clear_headers [-t <content-type list>]... [-s <status-code list>]... <new-header>...
默认值:no
配置段:http, server, location, location if
阶段:输出报头过滤器
清除指定的输出头。
1
2
3
4
5
|
more_clear_headers
-
s
404
-
t
'text/plain'
Foo
Baz
;
等同于
more_set_headers
-
s
404
-
t
'text/plain'
"Foo: "
"Baz: "
;
或
more_set_headers
-
s
404
-
t
'text/plain'
Foo
Baz
|
也可以使用通配符*,如:
1
|
more_clear
_headers
'X-Hidden-*'
;
|
清除开始由“X-Hidden-”任何输出头。
more_set_input_headers
语法:more_set_input_headers [-r] [-t <content-type list>]... <new-header>...
默认值:no
配置段:http, server, location, location if
阶段: rewrite tail
非常类似more_set_headers,不同的是它工作在输入头(或请求头),它仅支持-t选项。
注意:使用-t选项的是过滤请求头的Content-Type,而不是响应头的。
more_clear_input_headers
语法:more_clear_input_headers [-t <content-type list>]... <new-header>...
默认值:no
配置段:http, server, location, location if
阶段: rewrite tail
清除指定输入头。如:
1
2
3
4
5
|
more_clear_input_headers
-
s
404
-
t
'text/plain'
Foo
Baz
;
等同于
more_set_input_headers
-
s
404
-
t
'text/plain'
"Foo: "
"Baz: "
;
或
more_set_input_headers
-
s
404
-
t
'text/plain'
Foo
Baz
|
四. ngx_headers_more局限性
1. 不同于标准头模块,该模块不会对下面头有效: Expires, Cache-Control, 和Last-Modified。
2. 使用此模块无法删除Connection的响应报头。唯一方法是更改src/ HTTP/ ngx_http_header_filter_module.c文件。
五. 使用ngx_headers_more
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# set the Server output header
more_set
_headers
'Server: my-server'
;
# set and clear output headers
location
/
bar
{
more_set
_headers
'X-MyHeader: blah'
'X-MyHeader2: foo'
;
more_set_headers
-
t
'text/plain text/css'
'Content-Type: text/foo'
;
more_set_headers
-
s
'400 404 500 503'
-
s
413
'Foo: Bar'
;
more_clear
_headers
'Content-Type'
;
# your proxy_pass/memcached_pass/or any other config goes here...
}
# set output headers
location
/
type
{
more_set
_headers
'Content-Type: text/plain'
;
# ...
}
# set input headers
location
/
foo
{
set
$
my
_host
'my dog'
;
more_set_input
_headers
'Host: $my_host'
;
more_set_input_headers
-
t
'text/plain'
'X-Foo: bah'
;
# now $host and $http_host have their new values...
# ...
}
# replace input header X-Foo *only* if it already exists
more_set_input_headers
-
r
'X-Foo: howdy'
;
|
六. 应用ngx_headers_more
修改web服务器是什么软件,什么版本,同时隐藏Centent-Type、Accept-Range、Content-Length头信息。
1
2
3
4
|
more_set
_headers
"Server: ttlsa.com Web Server"
;
more_clear
_headers
"Content-Type:"
;
more_clear
_headers
"Accept-Ranges: "
;
more_clear
_headers
"Content-Length: "
;
|
404状态码添加header
配置如下:
1
2
3
4
5
|
more_set
_headers
"Server: ttlsa.com Web Server"
;
more_set_headers
-
s
404
"Error: Not found"
;
more_clear
_headers
"Content-Type:"
;
more_clear
_headers
"Accept-Ranges: "
;
more_clear
_headers
"Content-Length: "
;
|