如何编译加载ngx_headers_more模块?

Nginx

1 前言

一个问题,一篇文章,一出故事。
笔者最近需要修改反向代理的标头,于是整理ngx_headers_more模块的使用方法。
“ngx_headers_more”模块用于设置和清除输入和输出标头

2 模块“ngx_headers_more”

2.1 设置输出头过滤器

2.1.1 使用方法

语 法:more_set_headers [-t <content-type list>]… [-s <status-code list>]… <new-header>…
默认值:
上下文:http,server,location,location if
定 位:output-header-filter(输出头过滤器)
关于可选参数“-s”与“-t”,需要注意的是,
参数“-s”,为输出头的置操作指定条件,当匹配输出头后面指定的HTTP状态码时才执行操作(可选指定)
参数“-t”,为输出头的置操作指定条件,当匹配输出头后面指定的内容类型时才执行操作(可选指定)
参数“-t”,当“charset=utf-8”时请不要使用它,它无法达到你的预期的工作目标
关于必选参数“new-header”,需要注意的是它有三种表达形式,

Name: Value
Name: 
Name

第一种,“Name: Value”为相应的头设置一定的值
第二种,“Name: ”为相应的头设置空值
第三种,“Name”也是为相应的头设置空值
关于多个指令的优先级别,
– “http”优先于“server”,“server”优先于“location”
– 同一级别的指令按排列先后顺序执行
关于与“if”指定的嵌套使用,允许在“location”中使用,但不允许在“server”中使用,

   ?  # This is NOT allowed!
   ?  server {
   ?      if ($args ~ 'download') {
   ?          more_set_headers 'Foo: Bar';
   ?      }
   ?      ...
   ?  }

2.1.2 使用范例

more_set_headers    "Server: my_server";

以上为设置“Server”输出头的值为“my_server”,如果需要设置多个输出头,可以使用如下指令,

more_set_headers 'Foo: bar' 'Baz: bah';

指定设置条件的状态码的方式有两种,以下两种方式是等价的,

more_set_headers -s 404 -s '500 503' 'Foo: bar';
more_set_headers -s '404 500 503' 'Foo: bar';

同理,如下两种方式也是等价,

more_set_headers -t 'text/html' -t 'text/plain' 'X-Foo: Bar';
more_set_headers -t 'text/html text/plain' 'X-Foo: Bar';

如果需要使用变量设置,请参阅如下范例,

set $my_var "dog";
more_set_headers "Server: $my_var";

注:变量只能定义值,不允许定义标头的键

2.2 清空输出头过滤器

2.2.1 使用方法

语 法:more_clear_headers [-t <content-type list>]… [-s <status-code list>]… <new-header>…
默认值:
上下文:http,server,location,location if
定 位:output-header-filter(输出头过滤器)
关于可选参数“-s”与“-t”,需要注意的是,
参数“-s”,为输出头的置操作指定条件,当匹配输出头后面指定的HTTP状态码时才执行操作(可选指定)
参数“-t”,为输出头的置操作指定条件,当匹配输出头后面指定的内容类型时才执行操作(可选指定)
关于通配符,可参考如下使用范例,

more_clear_headers 'X-Hidden-*';

2.2.2 使用范例

more_clear_headers -s 404 -t 'text/plain' Foo Baz;

2.3 设置输入头过滤器

2.3.1 使用方法

语 法:more_set_input_headers [-r] [-t <content-type list>]…<new-header>…
默认值:
上下文:http,server,location,location if
定 位:rewrite tail(输入头过滤器)
关于可选参数“-t”,需要注意的是,
参数“-t”,为输入头的置操作指定条件,当匹配输入头后面指定的内容类型时才执行操作(可选指定)
参数“-t”,当“charset=utf-8”时请不要使用它,它无法达到你的预期的工作目标
关于可选参数“-r”,需要注意的是,
参数“-r”,用于把标头的旧值替换为新的值
参数“-r”,只要当旧值存在时替换操作才能生效
关于必选参数“new-header”,需要注意的是它有三种表达形式,

Name: Value
Name: 
Name

第一种,“Name: Value”为相应的头设置一定的值
第二种,“Name: ”为相应的头设置空值
第三种,“Name”也是为相应的头设置空值
关于多个指令的优先级别,
– “http”优先于“server”,“server”优先于“location”
– 同一级别的指令按排列先后顺序执行
关于与“if”指定的嵌套使用,允许在“location”中使用,但不允许在“server”中使用,

   ?  # This is NOT allowed!
   ?  server {
   ?      if ($args ~ 'download') {
   ?          more_set_input_headers 'Foo: Bar';
   ?      }
   ?      ...
   ?  }

2.3.2 使用范例

more_set_input_headers    "Foo: bar";

以上为设置“Foo”输入头的值为“bar”,如果需要设置多个输入头,可以使用如下指令,

more_set_input_headers 'Foo: bar' 'Baz: bah';

指定设置条件的状态码的方式有两种,以下两种方式是等价的,

more_set_input_headers -t 'text/html' -t 'text/plain' 'Foo: bar';
more_set_input_headers -t 'text/html text/plain' 'Foo: bar';

如果需要使用变量设置,请参阅如下范例,

set $my_var "bar";
more_set_input_headers "Foo: $my_var";

注:变量只能定义值,不允许定义标头的键

2.4 清空输入头过滤器

2.4.1 使用方法

语 法:more_clear_input_headers [-t <content-type list>]…<new-header>…
默认值:
上下文:http,server,location,location if
定 位:rewrite tail(输入头过滤器)
关于可选参数“-t”,需要注意的是,
参数“-t”,为输入头的置操作指定条件,当匹配输入头后面指定的内容类型时才执行操作(可选指定)
参数“-t”,当“charset=utf-8”时请不要使用它,它无法达到你的预期的工作目标
关于通配符,可参考如下使用范例,

more_clear_input_headers 'X-Hidden-*';

2.4.2 使用范例

more_clear_input_headers -t 'text/plain' Foo Baz;

3 最佳实践

3.1 实践环境

如果你没有nginx环境,可参阅如下章节部署,

如何编译安装nginx?

3.2 编译前准备

3.2.1 准备Nginx安装包

cd ~/
wget https://nginx.org/download/nginx-1.22.1.tar.gz
tar -xf nginx-1.22.1.tar.gz

3.2.2 准备模块的编译安装包

mkdir ~/nginx-1.22.1/modules
cd ~/nginx-1.22.1/modules
wget https://codeload.github.com/openresty/headers-more-nginx-module/tar.gz/refs/tags/v0.34 -O headers-more-nginx-module-0.34.tar.gz
tar -xf headers-more-nginx-module-0.34.tar.gz

3.3 重新编译nginx

3.3.1 执行nginx预编译

cd ~/nginx-1.22.1/
./configure \
#...
--add-module=./modules/headers-more-nginx-module-0.34

注:“#…”表示省略Nginx的基本编译参数

3.3.2 重新编译nginx

cd ~/nginx-1.22.1/
make

3.3.3 重新安装部署nginx

cd ~/nginx-1.22.1/
make install

3.4 使用模块

3.4.1 增加测试配置

vim /etc/nginx/nginx.conf

加入如下配置,

#有待更新

然后,你需要使用如下命令确认配置无语法错误,

nginx -t

3.4.2 重载配置使服务生效

systemctl reload nginx.service

参阅文档
=====================

官方github
—————-
https://github.com/openresty/headers-more-nginx-module#more_set_headers
使用案例
—————-
https://blog.kempkens.io/posts/exchange-reverse-proxy-using-nginx/
其他链接
—————-
https://www.nginx.com/resources/wiki/modules/headers_more/
https://www.jianshu.com/p/f0a84484d225
https://blog.csdn.net/zzhongcy/article/details/126172737

没有评论

发表回复

Nginx
如何解决https请求不安全http页被阻止问题?

1 前言 一个问题,一篇文章,一出故事。 笔者最近代理公司应用,发现https的页面有请求不安全的h …

Nginx
如何Nginx代理上游的子项目或文件夹?

1 前言 一个问题,一篇文章,一出故事。 笔者接到任务需要把Tomcat的其中一个应用号使用Ngin …

Nginx
如何安装部署RHEL 9 Nignx?

1 前言 一个问题,一篇文章,一出故事。 笔者需要基于RHEL 9部署Nginx环境,于是整理此文。 …