在Firefox加载页面之前修改URL

10

我想要为符合我的模式的URL添加前缀。当我在Firefox中打开一个匹配的URL时,页面不应该正常加载,而是应该先修改URL,然后再开始加载页面。

在Mozilla Firefox Addon中,在页面开始加载之前是否可以修改URL?

4个回答

9
浏览HTTPS Everywhere插件建议执行以下步骤:
  1. 使用nsIObserverService"http-on-modify-request"观察者主题注册一个observer
  2. 如果您的观察者通知的主题是nsIHttpChannel的实例,并且subject.URI.spec(URL)符合您的条件,则继续进行
  3. 创建一个新的nsIStandardURL
  4. 创建一个新的nsIHttpChannel
  5. 用新的替换旧的通道。在HTTPS Everywhere中完成此操作的代码非常密集,可能远远超出您的需求。我建议从chrome/content/IOUtils.js开始。
请注意,您应该为整个应用程序注册一个单独的“http-on-modify-request”观察者,这意味着您应该将其放在XPCOM组件中(请参见HTTPS Everywhere的示例)。
以下文章不能直接解决您的问题,但它们包含了许多示例代码,您可能会发现有帮助:

2
感谢Iwburk,我已经能够做到这一点。
我们可以通过用新的nsiHttpChannel覆盖它来实现这一点。虽然这样做有些复杂,但幸运的是,附加组件https-everywhere实现了这一点,以强制进行https连接。 https-everywhere的源代码在这里可以找到。
大部分所需的代码都在文件中: IO Util.js ChannelReplacement.js 只要我们设置了基本变量如Cc、Ci,以及定义了函数 xpcom_generateQI,就可以单独使用上述文件。
var httpRequestObserver =
{ 
  observe: function(subject, topic, data) {
    if (topic == "http-on-modify-request") {

        var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);     
        var requestURL = subject.URI.spec;

        if(isToBeReplaced(requestURL))  {

            var newURL = getURL(requestURL);        
             ChannelReplacement.runWhenPending(subject, function() {
                    var cr = new ChannelReplacement(subject, ch);
                    cr.replace(true,null);
                    cr.open();
                });
        }
    }

  },

  get observerService() {
    return Components.classes["@mozilla.org/observer-service;1"]
                     .getService(Components.interfaces.nsIObserverService);
  },

  register: function() {
    this.observerService.addObserver(this, "http-on-modify-request", false);

  },

  unregister: function() {
    this.observerService.removeObserver(this, "http-on-modify-request");

  }
};


httpRequestObserver.register();

该代码将“替换”请求而不是重定向。
虽然我已经充分测试了上述代码,但对于其实现我还不确定。据我所知,它复制请求通道的所有属性并将它们设置为要覆盖的通道。之后,以某种方式使用新通道提供原始请求请求的输出。
附言:我看到过一个SO帖子,其中建议使用这种方法。

你有完整的示例吗? - Bogdan

0
有没有可能在页面开始加载之前通过Mozilla Firefox插件修改URL?
是的,这是可能的。
使用Addon-SDK的page-mod,设置contentScriptWhen: "start" 然后,在完全防止文档被解析之后,您可以选择:
1.从同一域中获取不同的文档并将其注入页面。
2.在进行一些document.URL处理后,调用location.replace()
以下是一个执行第一种方法的示例:https://dev59.com/UV4b5IYBdhLWcg3w5VI9#36097573

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接