host

whistle的host转发功能,在保留传统hosts语法规则的同时,提供了更加灵活强大的匹配模式来满足不同场景的开发、调试需要。

保留传统的hosts语法规则

如果你习惯了通过修改操作系统hosts文件 (windows下为C:Windows\System32\drivers\etc\hosts,mac下为/etc/hosts) 的方式来修改域名解析,那么使用whistle时也可以采用同样的方法,并且不再需要使用管理员身份进行操作,切换起来也更加简洁。

Demo1

操作指引:启动whistle并设置好代理后,在浏览器中打开whistle页面,在Rules中添加一个新的配置项并勾选启用,在对应的配置编辑器中输入host规则即可。如图,访问www.example.com域名即会转发到本地80(或https:443)端口。


灵活强大的whistle匹配模式

Demo2

除了保留hosts文件单一的语法规则来支持域名匹配外,whistle还提供给开发者更加灵活强大的端口映射(即支持ip带端口)、CNAME、路径匹配、精确匹配、正则表达式、组合等host匹配模式。语法规则的一般描述如下:

  1. host pattern1 pattern2 patternN

host为计划转发到ip:port,pattern1-N为匹配请求url的表达式。当pattern只有一个时,host和pattern的顺序往往可以互换,具体可参考匹配模式

例子

  • 端口映射

    1. 127.0.0.1:8080 www.example.com
    2. # 位置可以调换,等价于:
    3. # www.example.com 127.0.0.1:8080

    对于本地开发调试,往往无法只在80端口提供Web服务。如果使用传统的hosts文件方式,我们只能通过www.example.com:8080访问到本地的8080端口,使用whistle提供的端口映射功能即可很好解决这一问题。

  • CNAME

    1. host://www.qq.com www.example.com
    2. # 位置可以调换,等价于:
    3. # www.example.com host://www.qq.com

    通过关键字host可以实现类似DNS的cname别名的功能,即通过域名www.example.com访问时,先访问的地址是通过解析域名www.qq.com得到的,与请求转发 www.example.com www.qq.com 不同,上面的配置不会后台收到的还是 www.example.com 的请求,而请求转发收到的是转发后url的请求。

  • 路径匹配

    1. 127.0.0.1:8080 example.com/test
    2. # 位置可以调换,等价于:
    3. # example.com/test 127.0.0.1:8080

    通过配置上述规则,可将example.com/test路径下的请求转发到本地的8080端口,比如请求example.com/test/a.htmlexample.com/test?a=1,但对于请求example.com/testa则不会进行转发处理。注意,使用传统的hosts语法,是将该域名下的所有请求都进行host替换处理。

  • 精确匹配

    1. 127.0.0.1:8080 $example.com/test
    2. # 位置可以调换,等价于:
    3. # $example.com/test 127.0.0.1:8080

    通过关键字$,只有请求example.com/test会转发到本地的8080端口,对于域名example.com外的其他请求都不会进行转发处理。

  • 正则表达式

    1. 127.0.0.1:8080 /example\.com/i
    2. # 位置可以调换,等价于:
    3. # /example\.com/i 127.0.0.1:8080

    通过配置上述规则,符合正则表达式/example\.com/i的请求,将转发到本地的8080端口进行处理,如请求example.com/index.htmlwww.example.com/index.html都将进行转发处理。

  • 通配符匹配

    1. 127.0.0.1:8080 */cgi-bin/test
    2. # 位置可以调换,等价于:
    3. # */cgi-bin/test 127.0.0.1:8080

    通过配置上述规则,符合正则表达式xx.xx.xx/cgi-bin/test的请求,将转发到本地的8080端口进行处理,如请求example.com/cgi-bin/test/index.htmlwww.example.com/cgi-bin/test都将进行转发处理。

  • 组合匹配

    1. 127.0.0.1:8080 http://example.com:5555 /example\.cn/i $www.example.com:6666/aa www.test.com/bb

    通过配置上述规则,域名example.com:5555下的所有http请求、请求中含有example.cn的所有请求、请求www.example.com:6666/aa、路径www.test.com/bb下的所有请求,都会转发到本地的8080端口。

过滤规则

需要确保whistle是最新版本:更新whistle

如果要过滤指定请求或指定协议的规则匹配,可以用如下协议:

  1. ignore:忽略指定规则
  2. filter:过滤指定pattern,支持根据请求方法、请求头、请求客户端IP过滤

例子:

  1. # 下面表示匹配pattern的同时不能为post请求且请求头里面的cookie字段必须包含test(忽略大小写)、url里面必须包含 cgi-bin 的请求
  2. # 即:过滤掉匹配filter里面的请求
  3. pattern operator1 operator2 excludeFilter://m:post includeFilter://h:cookie=test includeFilter:///cgi-bin/i
  4. # 下面表示匹配pattern1、pattern2的请求方法为post、或请求头里面的cookie字段不能包含类似 `uin=123123` 且url里面必须包含 cgi-bin 的请求
  5. operator pattern1 pattern2 includeFilter://m:post excludeFilter://h:cookie=/uin=o\d+/i excludeFilter:///cgi-bin/i
  6. # 下面表示匹配pattern的请求忽略除了host以外的所有规则
  7. pattern ignore://*|!host
  8. # 下面表示匹配pattern的请求忽略file和host协议的规则
  9. pattern ignore://file|host