Fiddler高级进阶——使用自定义脚本
发布在前端利器2015年2月13日view:12261
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

尽管 fiddler 提供了 “AutoResponder” 工具供我们修改http的返回,比如返回特定状态码、使用本机文件响应,但遇到一些稍微复杂的情况就无法信任了,这个时候,fiddler 强大的规则编辑器就π上用场了。

由于 fiddler 实质是一个本机代理,所有的http请求都可以由其转发,因此 fiddler 的规则编辑器有着极强的功能,几乎可以任意修改http的请求头和返回,要启用 fiddler 的规则编辑器,请从工具栏菜单的 rules->customize rules 进入,如果第一次进入,会建议您安装fiddler script editor,该编辑器带关键字着色和输入提示,因此可以提升脚本的编写效率。

fiddler 脚本使用类c#的语法,而且无需编译,保存直接生效,也无需重启 fiddler。

rule_editor

接下来看看 fiddler 的规则编辑器提供了哪些功能,事实上,所有的功能基本上都基于两类API,即对请求头的修改和对返回的修改。

常用功能API

操作

代码示例

可执行的位置

添加一个请求头

oSession.oRequest["NewHeaderName"] = "New header value";

OnBeforeRequest

删除一个返回头

oSession.oResponse.headers.Remove("Set-Cookie");

OnBeforeResponse

修改请求路径和查询参数

if (oSession.PathAndQuery=="/version1.css") {
  oSession.PathAndQuery="/version2.css";
}

OnBeforeRequest

修改请求的主机名

if (oSession.HostnameIs("www.bayden.com")) {
  oSession.hostname="test.bayden.com";
}

OnBeforeRequest

修改请求的主机名和端口

if (oSession.host=="www.bayden.com:8080") {
  oSession.host="test.bayden.com:9090";
}

OnBeforeRequest

模拟hosts功能,修改IP地址.  

(
不修改客户端请求重定向到给定ip)

// All requests for subdomain.example.com should be directed to the development server at 128.123.133.123
if (oSession.HostnameIs(“subdomain.example.com”)){
oSession.bypassGateway = true;                   // Prevent this request from going through an upstream proxy
oSession["x-overrideHost"] = "128.123.133.123";  // DNS name or IP address of target server
}

OnBeforeRequest

重定向请求到其他服务器的其他页面

if (oSession.url=="www.example.com/live.js") {
  oSession.url = "dev.example.com/workinprogress.js";
}

OnBeforeRequest

禁止cookie功能(其实就是删除了请求的Cookie头)

oSession.oRequest.headers.Remove("Cookie");

OnBeforeRequest

搜索并替换返回的HTML代码

if (oSession.HostnameIs("www.bayden.com") && oSession.oResponse.headers.ExistsAndContains("Content-Type","text/html")){
  oSession.utilDecodeResponse();
  oSession.utilReplaceInResponse('','<u>');
}

OnBeforeResponse

请求希伯来语言

oSession.oRequest["Accept-Language"]="he";

OnBeforeRequest

禁止css请求

if (oSession.uriContains(".css")){
 oSession["ui-color"]="orange"; 
 oSession["ui-bold"]="true";
 oSession.oRequest.FailSession(404, "Blocked", "Fiddler blocked CSS file");
}

OnBeforeRequest

实例

1、使指定URL支持CORS跨域请求

有时候,你调用一个 json 接口,发现跨域了,你需要去找接口的开发人支持跨域,显然傻傻等待后端开发完毕再联调是低效率的,这个时候就就要在后台改完之前就自己实现跨域的模拟,此时 fiddler 显然是再好不过的利器。支要持 CORS 跨域,就是要为请求的返回头增加 Access-Control-Allow-Origin 属性,因此需要修改 OnBeforeResponse函数,在该函数的末尾添加你的 CORS 逻辑, 代码:


    static function OnBeforeResponse(oSession: Session) {
        ...

        if(oSession.uriContains("要处理的url")){
            oSession.oResponse["Access-Control-Allow-Origin"] =  "允许的域名";
            oSession.oResponse["Access-Control-Allow-Credentials"] = true;
        }
    }

2、同一域名不同端口或目录转发到不同服务器

某些情况下,一个域名部署了多个业务的应用,但有时候你只需要修改自己的应用,这个时候你会使用hosts把该域名指向开发机,但问题来了,该域名下所有的应用都指向了同一个开发机,如何使得其他应用仍然指向正式环境?显然依靠传统的hosts工具无法解决这个问题,这时就需要编写fiddler规则脚本了:


    static function OnBeforeResponse(oSession: Session) {
        ...

        if(oSession.host == "www.google.com:80"){
            oSession["x-overrideHost"] = "123.123.123.123";
        }
        if(oSession.pathAndQuery.contains("/path1/"){
            oSession["x-overrideHost"] = "124.124.124.124";
        }else if(oSession.pathAndQuery.contains("/path2/"){
            oSession["x-overrideHost"] = "125.125.125.125";
        }
    }

结语

掌握了fiddler的规则脚本编辑,就为web调试打开了另一扇天窗,并且您还可以自己编写fiddler的扩展,遇到问题各种捉急的时期将一去不复返了!

评论
发表评论
5年前

请问如需要随机url有规定的语法吗?在url列表随机选择一个url,redirect,求教

6年前
赞了此文章!
6年前
赞了此文章!
6年前
赞了此文章!
WRITTEN BY
卖炭翁
解放生产力,提高生产力。
TA的新浪微博
PUBLISHED IN
前端利器

工欲善其事必先利其器

我的收藏