在 Fiddler 的 onBeforeRequest 或 onBeforeResponse 函数中使用 FiddlerScript 编写规则 可以自定义修改 web 请求或响应。使用哪个函数更合适取决于你在编码中需要使用的对象:OnBeforeRequest 会在每个请求前被调用,OnBeforeResponse 会在每个响应前被调用。注意:

  • 没办法在 OnBeforeRequest 内使用 response 类对象,因为它们还没被创建。
  • 可以在 OnBeforeResponse 内使用 request 类对象;然而,所有对它们的修改对 server 来说都是不可见的,因为在这之前 server 已经收到了请求。
  • 添加请求头:

    oSession.oRequest["NewHeaderName"] = "New header value";
    复制代码

    删除响应头:

    oSession.oResponse.headers.Remove("Set-Cookie");
    复制代码

    改变一个页面请求到同一服务器的另外一个页面:

    if (oSession.PathAndQuery=="/version1.css") {
      oSession.PathAndQuery="/version2.css";
    复制代码

    将一个服务器的所有请求指向到另一服务器的相同端口:

    if (oSession.HostnameIs("www.bayden.com")) {
      oSession.hostname="test.bayden.com";
    复制代码

    将一个服务器的所有请求指向到两一个服务器的不同端口:

    if (oSession.host=="www.bayden.com:8080") {
      oSession.host="test.bayden.com:9090";
    复制代码

    将一个服务器的所有请求指向到另一个服务器,包括 HTTPS tunnels:

    // 重定向浏览,包括 HTTPS tunnels
    if (oSession.HTTPMethodIs("CONNECT") && (oSession.PathAndQuery == "www.example.com:443")) { 
      oSession.PathAndQuery = "beta.example.com:443"; 
    if (oSession.HostnameIs("www.example.com")) oSession.hostname = "beta.example.com";
    复制代码

    模仿 Windows 的 HOSTS 文件,修改一个 Hostname 的指向到其它 IP 地址。(无需更改 Host 请求头实现修改访问目标):

    // 所有 subdomain.example.com 的请求将会定向到开发服务器 128.123.133.123
    if (oSession.HostnameIs("subdomain.example.com")){
      oSession.bypassGateway = true;                   // 阻止此请求通过上游代理
      oSession["x-overrideHost"] = "128.123.133.123";  // 目标服务器的 DNS 名称或者 IP 地址
    复制代码

    修改一个页面的请求指向到另一个页面,甚至指向到另一个服务器上的页面。(通过修改 Host 请求头实现):

    if (oSession.url=="www.example.com/live.js") {
      oSession.url = "dev.example.com/workinprogress.js";
    复制代码

    阻止上传 HTTP Cookies:

    oSession.oRequest.headers.Remove("Cookie");
    复制代码

    解压并拆包一个 HTTP 响应,按需更新响应头:

    // 为了更方便的修改响应数据,取消响应的压缩或打包
    oSession.utilDecodeResponse();
    复制代码

    搜索并替换 HTML:

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

    忽略大小写搜索响应中的 HTML:

    if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "text/html") && oSession.utilFindInResponse("searchfor", false)>-1){
      oSession["ui-color"] = "red";
    复制代码

    删除所有 DIV 标签(包括标签内的内容):

    // 如果响应头 content-type 为 HTML,删除所有 DIV 标签
    if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")){
      // 取消压缩和打包
      oSession.utilDecodeResponse();
      var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);
      // 替换所有 DIV 标签为空字符串
      var oRegEx = /<div[^>]*>(.*?)<\/div>/gi;
      oBody = oBody.replace(oRegEx, "");
      // 设置响应体内容为去掉 DIV 后的内容
      oSession.utilSetResponseBody(oBody); 
    复制代码

    将你的浏览器伪装成 Google 爬虫:

    oSession.oRequest["User-Agent"]="Googlebot/2.X (+http://www.googlebot.com/bot.html)";
    复制代码

    请求获得希伯来语(犹太人民族的语言以色列国通用语言)的内容:

    oSession.oRequest["Accept-Language"]="he";
    复制代码

    阻止 .CSS 请求:

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

    伪造一个 HTTP Basic 验证(需要用户输入密码后才能显示内容):

    if ((oSession.HostnameIs("www.example.com")) && 
        !oSession.oRequest.headers.Exists("Authorization")) 
        // 为了阻止 IE 出现 “友好的错误信息” 而隐藏掉我们的错误信息,需要使响应体的长度大于 512 字符。
        var oBody = "<html><body>[Fiddler] Authentication Required.<BR>".PadRight(512, ' ') + "</body></html>";
        oSession.utilSetResponseBody(oBody); 
        // 构建响应头
        oSession.oResponse.headers.HTTPResponseCode = 401;
        oSession.oResponse.headers.HTTPResponseStatus = "401 Auth Required";
        oSession.oResponse["WWW-Authenticate"] = "Basic realm=\"Fiddler (just hit Ok)\"";
        oResponse.headers.Add("Content-Type", "text/html");
    复制代码

    修改一个请求的响应为从本地 \Captures\Responses 文件夹加载的文件(可以用于 OnBeforeRequest 或 OnBeforeResponse 函数中):

    if (oSession.PathAndQuery=="/version1.css") {
      oSession["x-replywithfile"] ="version2.css";
    

    第一次翻译,有错望指出。