3

我正在尝试在浏览器中查找请求的 url 的重定向次数,如果可能的话,我想通过 javascript 跟踪该 URL 的重定向路径。

例如,如果我在浏览器中请求“A”。假设重定向流程为 A->B->C->D。意味着,它被重定向到'D'。在这种情况下,我需要获得三个 301 重定向状态代码和一个 200 ok 状态代码。

我在我的 addon.js 中尝试了以下方法(并为 firefox 浏览器制作了一个插件)。

var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
var StatusValue = req.status;

它给出了 200 ok(我认为它是最终 url)。

是否可以通过 Javascript 获取 URL 的所有 301 重定向。

谢谢,

4

2 回答 2

1

nsIXMLHttpRequestinterface有一个channel类型为 的成员(只能被扩展访问)nsIChannel。您可以将自己的回调分配给其notificationCallbacks属性并实现nsIChannelEventSync接口以接收重定向事件。这些方面的东西:

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

var req = new XMLHttpRequest();
req.open('GET', document.location);

var oldNotifications = req.channel.notificationCallbacks;
var oldEventSink = null;
req.channel.notificationCallbacks =
{
  QueryInterface: XPCOMUtils.generateQI([
      Components.interfaces.nsIInterfaceRequestor,
      Components.interfaces.nsIChannelEventSink]),

  getInterface: function(iid)
  {
    // We are only interested in nsIChannelEventSink, return the old callbacks
    // for any other interface requests.
    if (iid.equals(Ci.nsIChannelEventSink))
    {
      try {
        oldEventSink = oldNotifications.QueryInterface(iid);
      } catch(e) {}
      return this;
    }

    if (oldNotifications)
      return oldNotifications.QueryInterface(iid);
    else
      throw Components.results.NS_ERROR_NO_INTERFACE;
  },

  asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback)
  {
    var type = null;
    if (flags & Components.interfaces.nsIChannelEventSink.REDIRECT_TEMPORARY)
      type = "temporary";
    else if (flags & Components.interfaces.nsIChannelEventSink.REDIRECT_PERMANENT)
      type = "permanent";
    else if (flags & Components.interfaces.nsIChannelEventSink.REDIRECT_INTERNAL)
      type = "internal";

    Components.utils.reportError("Redirect from " + oldChannel.URI.spec + " " +
                                 "to " + newChannel.URI.spec + " " +
                                 (type ? "(" + type + ")" : ""));

    if (oldEventSink)
      oldEventSink.asyncOnChannelRedirect(oldChannel, newChannel, flags, callback);
    else
      callback.onRedirectVerifyCallback(Cr.NS_OK);
  }
};

req.send(null);

此代码确保在记录任何对nsIChannelEventSync.asyncOnChannelRedirect.

供参考:nsIInterfaceRequestorXPCOMUtils

于 2012-06-28T08:18:10.350 回答
-1

thx,代码有效,但不如预期:A->B->C->D (channel_1 -> channel_2 -> channel_3 -> channel_4).

在我的情况下,它将记录一个重定向链,A->B->C->D如:

A->B (channel_1 -> channel_2), than B->C (channel_1 -> channel_2), C->D (channel_1 -> channel_2);哪里channel_1 & channel_2是随机哈希数。

所以我不能把链条链接在一起。这将是捕获事件链的策略(而页面重定向使用,元刷新,javascript,http ...)?

于 2018-01-19T10:11:05.747 回答