因为想要将非业务域名内嵌到微信小程序中,所以用到了nginx的反向代理功能来替换域名实现盗站(缘起:http://www.cnblogs.com/kenwar/p/8288882.html),但是替换域名后问题来了,因为XmlHttpRequest同源策略:“禁止向不同源的地址发起HTTP请求” 所以光替换域名还是不够,还需要替换响应内容里的一些ajax请求,这就涉及到了nginx的响应内容替换功能。

  一、简单替换模块 ngx_http_sub_module:

    (1)介绍:

      ngx_http_sub_module模块是一个过滤器,它修改网站响应内容中的字符串。这个模块已经内置在nginx中,但是默认未安装,需要安装需要加上配置参数:--with-http_sub_module 如果已经安装nginx,只需要再添加这个模块就可以了。

    (2)常用指令:

      2.1 sub_filter指令: sub_filter string(原字符串) replacement(用于替换的字符串);

        用于设置需要使用说明字符串替换说明字符串.string是要被替换的字符串,replacement是 新的字符串,它里面可以带变量。

      2.2 sub_filter_last_modified指令: sub_filter_last_modified on | off;

        用于设置网页内替换后是否修改 可在nginx.conf的 http, server, location三个位置配置使 用,默认值是off;

      2.3 sub_filter_once指令:sub_filter_once on | off;

        用于设置字符串替换次数,默认只替换一次。如果是on,默认只替换第一次匹配到的到字 符,如果是off,那么所有匹配到的字符都会被替换;

      2.4 sub_filter_types指令:sub_filter_types *

        用于指定需要被替换的MIME类型,默认为“text/html”,如果制定为*,那么所有的;

    (3)说明:

      3.1以上指令可在nginx.conf的http, server, location三个位置配置使用;

      3.2此模块替换不区分大小写;

      3.3支持中文替换;

    (4)示例:     

location ^~/im/ {
proxy_pass http://p.qiao.baidu.com;
add_header Access-Control-Allow-Origin *;
sub_filter 'http://p.qiao.baidu.com' 'https://www.demo.com';##将响应内容中的域名替换成本站域名
sub_filter_once off;####所有匹配到的都替换
}

    (5)总结:

       使用ngx_http_sub_module模块好处是nginx内置该模块使用方便,不足之处在于该模块不支持正则替换,灵活性不够

  二、支持正则匹配替换的第三方模块ngx_http_substitutions_filter_module:

    (1)下载地址:https://github.com/yaoweibin/ngx_http_substitutions_filter_module/archive/master.zip

    (2)解压缩,平滑升级nginx(升级方式可参考前一篇文章平滑添加ssl模块:http://www.cnblogs.com/kenwar/p/8295907.html (添加参数--add-module=/模块解压后文件路径))

    (3)使用说明:

location / {
subs_filter_types text/html text/css text/xml;
subs_filter st(\d*).example.com $1.example.com ir;
subs_filter a.example.com s.example.com;
subs_filter http://$host https://$host;
}
从github给出的使用示例来看,这个模块涉及2个指令:
* subs_filter_types
subs_filter_types 语法: subs_filter_types mime-type [mime-types]
默认: subs_filter_types text/html
适用: http, server, location
subs_filter_types 是用来指定替换文件类型的 默认仅仅替换text/html类型的文件。 * subs_filter
subs_filter 语法: subs_filter source_str destination_str [gior]
默认: none
适用: http,server,location
subs_filter 是用来替换文本的,可以使用正则
g(默认):替换匹配项。
i :区分大小写的匹配
o : 只匹配发现的第一个。
r : 正则匹配。

    (4)案例分享:

        替换响应内容中的某个js,因为js版本不固定,路径是变动的,所以用到正则

location ^~/f/ {
proxy_pass http://xxx.xxxx.com;
add_header Access-Control-Allow-Origin *;
subs_filter 'https://cdn.jinshuju.net/assets/published_forms/mobile/application-(.*?(\.js){1})' 'https://www.demo.com/comm/js/jinshujujsforsmallproject.js' ir ;
}

    (5)说明:

       在使用正则模式时,不能使用nginx内置变量,比如:$host,否则会出现如下报错:
        nginx: [emerg] match part cannot contain variable during regex mode in *

nginx替换响应内容的更多相关文章

  1. nginx替换响应头(重点:如何在替换时加上if判断)

    在实现微信小程序内嵌非业务域名时,通过nginx做镜像网站绕过小程序业务域名检测,但有一些表单页面提交后会返回一个302状态,由响应头Location的值决定提交成功后的跳转地址.那么问题来了,这个地 ...

  2. Nginx 返回响应过滤响应内容

    陶辉94课 过滤模块 从下到上顺序 ngx_http_proxy_module 模块 Syntax: proxy_ignore_headers field ...; Default: — Contex ...

  3. Nginx作为静态内容服务器(Windows环境)

    1.简单安装 1)下载 http://nginx.org/en/download.html 2)解压后的路径 E:\Study\nginx\nginx-1.7.6 3)执行nginx.exe,访问ht ...

  4. nginx记录响应与POST请求日志

    生产环境中的某些api出现故障,但是问题无法重现,但是又很想解决掉问题以及我们新项目上线,需要跟踪请求与响应的信息,可以预先找到一些bug,减少大面积的损失. 安装nginx与ngx_lua 响应日志 ...

  5. nginx 提供静态内容

    Serving Static Content 提供静态内容 原文地址:http://nginx.com/resources/admin-guide/serving-static-content/ Th ...

  6. Fiddler插件 --- 解密Elong Mapi请求参数及响应内容

    当前问题: 在我们日常的Web/App测试过程中, Fiddler是一大辅助利器:在我们团队,也经常使用Fiddler进行App抓包测试. 艺龙 App使用的REST(内部称为Mapi)接口,在使用过 ...

  7. 使用FreeCookies 控制浏览器cookies及修改http响应内容

    FreeCookies 插件安装 :您的计算机需要已经安装Fiddler (如未安装,请至官网下载安装 http://docs.telerik.com/fiddler/configure-fiddle ...

  8. 3-Fiddler修改请求或响应内容

    1.修改请求内容 方法一:设置请求前断点,修改请求后发送 1)设置断点 2)选中请求,在inspectors下修改请求内容 3)修改请求后,点击Break on Response按钮,进行请求的发送 ...

  9. Web Service之Soap请求响应内容中文编码解密

    java模拟Soap请求测试Web Service接口,发现Web Service响应内容中的中文竟然是编码格式.比如: 中文:退保成功 Soap中文编码:退保成功   我仔细分析后发现,退编码实际上 ...

随机推荐

  1. Nastya Is Buying Lunch

    At the big break Nastya came to the school dining room. There are nn pupils in the school, numbered ...

  2. mongo删除指定字段,可多个字段同时删除

    参考代码: db.getCollection('Person').update({"email":{$exists:true}},{$unset:{"email" ...

  3. flask 中使用 socket 遇到的坑

    很久没用博客园了,最近涉及到一个问题,需要向前端推送日志 考虑的方案两个,一个是定时ajax 但是这样效率太慢了,二是用socket 那看看有没有轮子咯,面向百度编程,有两个库可以使用 1.flask ...

  4. hrbust 2384 相同的不相同的字符串

    Description 研究证明,汉的字阅读序顺是不会影响你明白这句话的意思的. 但是如果顺序差的太多也是会影响的,比如汉阅读顺的序字你就看不懂什么意思了. 那么多少算多呢?科学家芦苇给出证明,当两个 ...

  5. 学习笔记-----《Pattern Recognition and Machine Learning》Christopher M. Bishop

    Preface 模式识别这个词,以前一直不懂是什么意思,直到今年初,才开始打算读这本广为推荐的书,初步了解到,它的大致意思是从数据中发现特征,规律,属于机器学习的一个分支. 在前言中,阐述了什么是模式 ...

  6. NOIP2013提高组 T2 火柴排队

    一开始看也想不到这居然要用到逆序对,归并排序. 先来看看题目: 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间 ...

  7. vue-cli利用router创建单页面

    一.创建脚手架 第一步 打开命令输入vue init webpack-simple vue-name 下载webpack-simple  (vue-name是你要创建的项目名称) 第二步 输入cd v ...

  8. 将Redhat,CentOS,Ubuntu虚拟机的IP设为静态IP的方法

    一般在主机上创建的虚拟机默认是通过DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)网络协议来动态生成的,这样会导致你安装的虚拟机的IP地址是动态变化 ...

  9. pytroch nn.Module源码解析(1)

    今天在写一个分类网络时,要使用nn.Sequential中的一个模块,因为nn.Sequential中模块都没有名字,我一时竟无从下笔.于是决定写这篇博客梳理pytorch的nn.Module类,看完 ...

  10. Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to ;XX.XX.XX.XX:6379] with root cause

    java.net.ConnectException: Connection refused: no further information at sun.nio.ch.SocketChannelImp ...