出于开发目的,我正在尝试构建一个扩展,将与正则表达式匹配的所有请求重定向到特定页面。问题是firefox API似乎没有做chrome.webRequest.onBeforeSendHeaders.addListener
文档中宣传的内容。以下是扩展程序的简化版本:
manifest.js
{
"applications": {
"gecko": {
"id": "addon@example.com",
"strict_min_version": "42.0",
"strict_max_version": "50.*",
"update_url": "https://example.com/updates.json"
}
},
"name": "Developer",
"version": "0.1.26",
"manifest_version": 2,
"description": "A script useful for development.",
"icons": {"16": "logo16.png",
"48": "logo48.png",
"128": "logo128.png"},
"background": {
"scripts": ["background.js"]
},
"web_accessible_resources": ["hello.html"],
"permissions": [
"activeTab",
"webRequest",
"webRequestBlocking"
]
}
background.js
// I found somewhere that onBeforeSendHeader it should work but it doesn't.
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
var redirect;
if (details.url.match(/example\.com/)) {
redirect = chrome.extension.getURL("hello.html");
console.log("Redirecting:", details.url, "->", redirect);
return {redirectUrl: redirect};
}
console.log("Requesting:",details.url);
}, {urls: [
"<all_urls>"
]}, ["blocking"]);
hello.html的
<html>
<head>It works</head>
<body>And it's not apache!</body>
</html>
简而言之,它会将从example.com
获取的所有内容重定向到扩展资源hello.html
。
所以我转到about:config并将security.fileuri.strict_origin_policy
设置为false
。然后我转到about:debugging
并加载扩展程序。然后我打开浏览器控制台Tools -> Web Developer -> Browser Console
。最后我去了example.com。我应该得到hello.html
的内容,但我什么都没得到(白屏),在浏览器控制台中我得到了:
Redirecting: "http://example.com/" -> "moz-extension://ce33a9b5-2c20-ed41-b8aa-f52143783c38/hello.html"
Security Error: Content at http://example.com/ may not load or link to file:///path/to/extension/hello.html.
我需要扩展用于个人开发目的,因此我不介意更改about:config
。
编辑:如果我将重定向网址更改为网络上的内容,onBeforeReqeuest
更改为onBeforeSendHeaders
,一切正常:
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
var redirect;
if (details.url.match(/example\.com/)) {
redirect = "https://www.google.com"; // chrome.extension.getURL("hello.html");
console.log("Redirecting:", details.url, "->", redirect);
return {redirectUrl: redirect};
}
console.log("Requesting:",details.url);
}, {urls: [
"<all_urls>"
]}, ["blocking"]);
Edit2:抱歉这将是一个WebExtension(虽然我认为很明显,因为有一个manifest.json
文件而不是install.rdf
。此外,addListener
部分的文档onBeforeRequest声明:
返回:webRequest.BlockingResponse。如果在“extraInfoSpec”参数中指定了“blocking”,则事件侦听器应返回此类型的对象。
然后在BlockingResponse文档:
redirectUrl可选 串。仅用作对onBeforeRequest和onHeadersReceived事件的响应。如果设置,则阻止原始请求 从发送/完成,而是重定向到给定的URL。 允许重定向到非HTTP方案,例如data :.重定向 由重定向操作启动使用原始请求方法 重定向,但有一个例外:如果重定向是在 onHeadersReceived阶段,然后重定向将使用 GET方法。
答案 0 :(得分:0)
这对Chrome和Firefox都适用。
let { tabId } = details;
let redirectUrl = chrome.extension.getURL('hello.html');
if(navigator.userAgent.toLowerCase().indexOf("firefox") > -1) {
chrome.tabs.update(tabId, {
url: redirectUrl
})
return {
cancel: true
}
} else return { redirectUrl }