http://www.ttlsa.com/nginx/nginx-custom-header-to-return-information-module-ngx_headers_more/
一. 介绍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: ";
|
nginx定制header返回信息模块ngx_headers_more的更多相关文章
-
Nginx里Header修改
有时候,我们可能有修改Nginx默认Header的需求.本文就将常见的方法列出来供大家参考. 修改普通请求的Header Nginx内置的模块暂时仅支持修改响应头,使用add_header.其中: a ...
-
nginx 为什么要反向代理 影藏后端 高效连接(给nginx,他自己返回) 端口冲突解决 多个服务
nginx 为什么要反向代理 影藏后端 高效连接(给nginx,他自己返回) 端口冲突解决 多个服务 单机使用反向代理可以根据不同url匹配到不同站点 rsync 的工作原理和应用实例 ...
-
修改Nginx的header伪装服务器
有时候为了伪装自己的真实服务器环境.不像让对方知道自己的webserver真实环境,就不得不修改我们的webserer软件了!今天看了一下baidu.com的webserver感觉像是nginx修改的 ...
-
nginx 自定义代理返回 404
在nginx的http段,加上一面的配置 proxy_intercept_errors on;//自定义代理返回的404错误提示
-
nginx自定义header支持
今天配置nginx的时候遇到一个问题,直接访问接口没有问题,但是通过nginx转发之后,总是报token失效,无法获取token值,发现请求头丢失了. 默认是不支持非nginx标准的用户自定义head ...
-
Nginx通过header转发
假设添加自定义头 "my-header",当"my-header"等于test时,转发到192.168.1.113 请求如下 wget --header=&qu ...
-
nginx 转发 header 数据丢失
刚帮同事解决了个问题,记录一下,现象:放在header里面的数据,本地后台可以收到,集成可以收到,测试不行, 查看代码没问题,排除代码问题,比较集成和测试环境有何不同,发现集成环境是局域网访问,192 ...
-
php nginx 获取header信息
nginx中可能没有getallheaders函数 因此编写新函数 function NginxGetAllHeaders(){//获取请求头 $headers = []; foreach ($_SE ...
-
Nginx Parsing HTTP Package、header/post/files/args Sourcecode Analysis
catalog . Nginx源码结构 . HTTP Request Header解析流程 . HTTP Request Body解析流程 1. Nginx源码结构 . core:Nginx的核心源代 ...
随机推荐
-
php isset( $test ) 的神奇之处。
很久一段时间没更新博客了,由于近段时间一直在忙 挑战杯 的项目,所以没怎样把一些总结放上来.这次,总结下 php 的一个 函数 : boolean isset($test), 返回值:boolean类 ...
-
JavaScript——事件模型
DOM事件流: DOM(文档对象模型)结构是一个树型结构,当一个HTML元素产生一个事件时,该事件会在元素结点与根节点之间按特定的顺序传播,路径所经过的节点都会收到该事件,这个传播过程可称为DOM事件 ...
-
HDU 1224 Free DIY Tour
题意:给出每个城市interesting的值,和城市之间的飞行路线,求一条闭合路线(从原点出发又回到原点) 使得路线上的interesting的值之和最大 因为要输出路径,所以用pre数组来保存前驱 ...
-
use isSubstring to check if one word is a rotation of another.
1: /// <summary> 2: /// Assume you have a method isSubstring which checks if one word is a s ...
-
[转] SQL Server游标的使用
游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. ...
-
JAVA:创建类和对象
package duixiang; public class duixiang { /* * 类的实例化:创建对象 */ public static void main(String[] args) ...
-
linux之sed的使用
基本介绍 sed是stream editor的缩写,一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲 ...
-
unity之让obj旋转自转等操作
1.让cube沿着矩形四个点运动 using System.Collections; using System.Collections.Generic; using UnityEngine; publ ...
-
sqlitestudio
SQLite数据库的特性 特点: 1.轻量级2.独立性,没有依赖,无需安装3.隔离性 全部在一个文件夹系统4.跨平台 支持众多操作系统5.多语言接口 支持众多编程语言6.安全性 事物,通过独占性和共享 ...
-
题解——HDU 2089 不要62(数位DP)
最近在学数位DP 应该是入门题吧 设\( dp[i][0/1] \)表示到第\( i \)位时,前一位是否是6的满足条件的数的个数 然后就是套路 注意\( limit \)的限制条件以及转移时候信息的 ...