我正在尝试查找浏览器中请求的 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 重定向。
谢谢,
最佳答案
nsIXMLHttpRequest
interface有一个类型为 nsIChannel
的成员 channel
(只能由扩展程序访问) .您可以将自己的回调分配给它的 notificationCallbacks
属性并实现 nsIChannelEventSync
interface接收重定向事件。沿着这些线的东西:
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
的任何调用时始终调用旧的通知回调。
供引用:nsIInterfaceRequestor , XPCOMUtils .
关于javascript - 跟踪 JavaScript 中 URL 的重定向路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11206967/