HAOUTIL.COM

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中跳过这些链接即可。