Firefox Http请求重定向
Firefox有 3个时机 可以重定向Http请求:
1. 在请求创建之前
Firefox支持一种称为内容策略(content policies)
的机制[1],所有资源的加载都需要先经过这个机制的过滤。
扩展和UC脚本可以通过实现nsIContentPolicy
接口来注册自己的内容策略,在shouldLoad
方法中决定是否拒绝当前Http请求并创建新的请求来达到重定向的目的。
2. 在请求发送到服务器之前
当一个Http请求创建完成时,Firefox会发出一个名为http-on-modify-request
的通知。扩展和UC脚本可以通过实现nsIObserver
接口来接收这个通知。
在Firefox 20之前,对于关闭一个Http请求并发起新的请求比较麻烦,https-everywhere扩展对此有相关的实现,而在在Firefox 20之后的版本中可以方便的使用redirectTo
方法方法来实现。
3. 响应返回后对响应内容进行修改
和Http请求创建一样,在收到响应时,Firefox会发出一个名http-on-examine-response
的通知(除了这2种,还有各种各样的通知,详情可以查看MDN)。
修改响应内容可以通过实现nsITraceableChannel
接口[2]来实现。
虽然,现在我们在3个时机都可以对Http请求进行重定向,但是还需要解决:
1. 对服务器发起的30X重定向进行重定向
对于30X重定向,上述3个方法都无能为力。好在Firefox提供了nsIChannelEventSink
接口,每次30X发生都会调用这个接口。所以通过实现这个接口,就可以对30X后的连接进行判断是否需要重定向了。
2. 带“href="_blank"的链接不会在新标签页(窗口)打开
这个问题是由于在时机1中,是在新标签(窗口)创建之前就发生了重定向造成的。对于这个问题,我们可以实现nsIDOMEventListener
接口,监听DOM点击事件,缓存带“href="_blank"的链接,在时机1中跳过这些链接即可。