HowTo:Pipy 如何修改请求和响应的内容
在使用代理时,免不了因为各种需求要对请求和响应的内容进行修改。作为可编程的代理,这些功能对 Pipy 来说非常 easy。今天,我们就以两个常见的功能为例。
HTTP 缓存
Pipy 有篇教程是《静态资源服务》,这个就是实现静态服务器的原型。我们最新的网站 https://flomesh.io,正是使用 Pipy 作为静态服务器和 CDN 的。对此感兴趣的同学,可以联系交流,后续我们也会对此写一篇详细的介绍文章。
这里说的只是静态服务器的其中一项功能 HTTP 缓存,在实现这项功能时我们对响应进行了修改。HTTP 缓存的实现有多种,各有优缺点,而我们要讲的是 ETags。
ETag HTTP 响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。而如果内容发生了变化,使用 ETag 有助于防止资源的同时更新相互覆盖(“空中碰撞”)。
来自 Mozilla 的介绍
假如请求头中的 If-None-Match
值与服务器中资源的版本标识一致,则直接返回 304 Not Modified
响应;否则,返回 200 OK
和最新标本标识的 ETag
,以及资源内容。
HTTP
304 Not Modified
说明无需再次传输请求的内容,也就是说可以使用缓存的内容。
实现
代码很简单,以增加新模块(etag.js)的方式添加 HTTP 缓存的支持:
这里的实现我们修改了改响应头和响应的内容,接下来我们以 XFF 为例看下如何修改请求。
XFF
X-Forwarded-For(XFF)是用来识别通过 HTTP 代理或负载均衡方式连接到 Web 服务器的客户端最原始的 IP 地址的 HTTP 头字段。
格式:
X-Forwarded-For: client1, proxy1, proxy2
最左边(client1)是最原始客户端的 IP 地址, 代理服务器每成功收到一个请求,就把请求来源 IP 地址添加到右边。
我们在 04-routing 脚本的基础上,增加了逻辑处理:
作为上游服务的 02-echo 我们增加了代码以便打印出请求头部的信息:
从日志中,我们看到了上游服务的头部已经可以看到客户端的 IP 192.168.1.5
。
总结
请求和响应的修改对代理来说是经常用到的功能,除了文中在请求响应头部增加内容,实际上也会需要删除某些信息。比如对上游屏蔽用于安全验证的请求头,或者对响应头部内容进行清理,减少响应大小或者避免敏感信息的泄漏。
传统的代理,在这些实现上少了一些灵活性,提供的能力都是固化在内部的逻辑中。而 Pipy 可编程的理念,让这些功能的实现具有更高的灵活性,易扩展。同时,功能的增加和更新都可以实时更新和加载,对基础设施管理维护的成本更低。
版权声明: 本文为 InfoQ 作者【Flomesh】的原创文章。
原文链接:【http://xie.infoq.cn/article/9f44347d2ad0626b709e869f0】。文章转载请联系作者。
评论