nginx配置ngx_http_sub_module

1.前言

nginx的ngx_http_sub_module模块,可以用于修改网站响应内容中的字符串,如过滤敏感词。第三方模块ngx_http_substitutions_filter_module,弥补了ngx_http_sub_module的不足,可以采用正则表达式替换。

2.安装ngx_http_sub_module

  • 查看是否安装改模块
    nginx -V查看,如果包含http_sub_module则支持,否则不支持。
    在这里插入图片描述
    图中是支持的,可以直接使用,如果不支持需要重新编译安装nginx,编译参数加上–with-http_sub_module模块即可

3.使用说明

subs_filter_types

  subs_filter_types

    语法: subs_filter_types mime-type [mime-types]

    默认:subs_filter_types text/html (高版本的nginx如果有写着条,那么重启服务的时候会有警告信息,因为默认就是检查 text/html的信息,与程序有重复配置)

    适用区域:http, server, location

    subs_filter_types是用来指令需要替换的文件类型,默认是text/html类型。* 表示所有类型。

    此模块无法处理经过压缩的内容,虽然能与gzip filter模块兼容,但无法处理反向代理返回的内容。当需要处理反向代理的内容时,可以使用如下语句禁用压缩:

   proxy_set_header Accept-Encoding '';

subs_filter

 subs_filter

    语法;subs_filter 源字段串 目标字段串 [gior]

    默认:无

    适用区域:http, server, location

    subs_filter指令允许在nginx响应输出内容时替换源字段串(正则或固定)为目标字符串。第三个标志含意如下:

    g(默认): 替换所有匹配的字段串。(默认可省略)

    i: 执行区分大小写的匹配。

    o: 仅替换首个匹配字符串。

    r: 使用正则替换模式,默认是固定模式。


4.配置实例

该实例的主要目的:

  1. 把请求中的电话号码替换为我们指定的电话号码
  2. 页面中的所有请求地址都替换为走Nginx地址的请求(HTML中有很多资源文件的地址、AJAVX请求地址都必须替换为走当前NGINX的地址)
    在这里插入图片描述

注意:
上面配置表示把 http://IP:9090/travel/hotel/getReview/xxxx 转发为 http://m.elong.com/hotel/XXXX
URI会替换掉 location 所匹配的URI部分

5.大坑

  • 禁用压缩(现象:web返回数据未替换,CURL返回替换成功)
    大家Nginx 反代时很常见的一个问题就是 sub_filter 无效。因为浏览器都是允许压缩的,所以请求头都是带 Accept-Encoding: gzip 的。而 Nginx 的 sub_filter 无法处理压缩过的请求, Nginx 自身也不会解压。事实上,要想写一个解压的插件也是不可能的,因为 Nginx 目前并没有 input filtering 相关的接口。
    一般网上的解决办法都是 proxy_set_header Accept-Encoding “”;禁用上游的压缩,对客户端的压缩不受影响。
  • 默认只替换HTML,要替换所有类型使用*

6.参考文献

发布了418 篇原创文章 · 获赞 745 · 访问量 126万+

猜你喜欢

转载自blog.csdn.net/u013467442/article/details/90680305