HTTP过滤模块

428 阅读2分钟

上图是nginx的11ge阶段,当执行到content阶段时,会生成响应内容,之后要通过HTTP的过滤模块进行加工处理,所以HTTP过滤模块的执行时间是在content阶段之后,log阶段之前。

一、HTTP过滤模块调用流程

当nginx接收到一个请求的过程是:

  • nginx接收到一个请求时,先接收HTTP头部。

  • 然后经过preaccess阶段的limit_req模块和limit_conn模块。

  • 再经过access阶段的access模块和auth_basic模块。

  • 再经过content阶段的concat模块和static模块。在这个阶段会生成响应。

  • 如果生成的响应是一张图片的话,首先会对header进行image_filter模块的缩略处理,再进行gzip压缩,这个顺序是不能乱的。

  • 再对body进行缩略处理和gzip压缩。

二、sub模块对响应中的字符串 进行替换

该模块能对响应中的字符串进行替换,全称是ngx_http_sub_filter_module模块,默认是未被编译进nginx中的,可以使用--with-http_sub_module进行编译。

1、指令

  • sub_filter:sub_filter string replacement,string为被替换字符串,replacement为替换字符串。

  • sub_filter_last_modified:on/off,修改了响应,是否还显示原先响应的last_modified,默认为off。

  • sub_filter_once:on/off,对body中的所有string对进行匹配替换,还是只匹配替换一次,默认是on,全部匹配替换。

  • sub_filter_types:只针对什么类型的响应进行替换,默认是text/html,可以设置为*,但是性能很差,它会对所有类型的都进行匹配替换。

2、案例

对nginx.org进行替换。

使用sub模块之前:

nginx.org对应的链接地址是nginx.org/。

使用sub模块进行替换:

nginx配置:

location / {
  sub_filter 'nginx.org' 'test';
  sub_filter_once on;
  sub_filter_last_modified on;
}

这里开启了sub_filter_once,对nginx.org只进行一次替换。

重启之后:

这里nginx.org/被替换成了http:/…

三、addition模块在响应的前后添加内容

该模块可以在HTTP响应之前和之后添加不同的内容,增加内容的方式是通过增加自请求完成的。默认没有被编译进nginx中,可以使用--with-http_addition_module启用。

1、指令

  • add_before_body:add_before_body uri,nginx会去访问该url,添加的内容就是该uri返回的东西。

  • add_after_body:add_after_body uri,同上。

  • addition_types:可以添加的文件类型,默认是text/html。

2、案例

location / {
  add_before_body /before;
  add_after_body /after;
}

location /before {
  return 200 'before';
}

location /after {
  return 200 'after';
}

重启之后页面内容变为:

原理:阻塞住之前的请求,生成新的请求,当新请求的响应返回之后,再激活之前的请求。