javascript - 从 3xx 获取重定向位置 (URL):使用 Web 扩展重定向 HTTP 响应
问题描述
在普通的 web JS 中是不可能做到的。例如,以下代码无法按您预期的那样工作:
fetch("https://crbug.com", { redirect: "manual" })
出色地。但是可以在网络扩展中做吗?
我需要获取 URL 的重定向位置。仅允许您查看fetch
是否有重定向,以及最终位置(不是中间位置,当重定向计数大于 1 时)并且仅在页面成功加载后(我根本不想下载页面(甚至只有 HTTP 标头)——不要与来自Location
HTTP 响应标头的页面执行任何连接)。
例如:
对于https://bit_ly/2ng6XCg
* 我应该得到“ http://crbug.com ”
对于“ http://crbug.com ”,我应该得到“ https://crbug.com ”
对于“ https://crbug.com ”,我应该得到“ https://bugs.chromium.org/p/chromium/issues/list ”。
*替换_
为.
解决方案
感谢 wOxxOm,我写了我想要的:
function getRedirect(url) {
return new Promise((resolve) => {
let blockedURL;
function onRequest(details) {
//console.log("onBeforeRequest ", details);
if (details.url === blockedURL) {
setTimeout(() => {
chrome.webRequest.onBeforeRequest.removeListener(onRequest);
resolve(blockedURL);
});
return { cancel: true };
}
}
chrome.webRequest.onBeforeRequest.addListener(onRequest, { urls: ["<all_urls>"] }, ["blocking"]);
function onRedirect(details) {
//console.log("onBeforeRedirect", details);
blockedURL = details.redirectUrl;
chrome.webRequest.onBeforeRedirect.removeListener(onRedirect);
}
chrome.webRequest.onBeforeRedirect.addListener(onRedirect, { urls: ["<all_urls>"] });
fetch(url, { redirect: "follow" }).catch(console.warn);
});
}
让我们检查一下代码:
(async () => {
console.log("URL Redirects to ", await getRedirect("http://crbug.com"));
// "URL Redirects to https://crbug.com"
console.log("URL Redirects to ", await getRedirect(await getRedirect("http://crbug.com")));
// "URL Redirects to https://bugs.chromium.org/p/chromium/issues/list"
await fetch("http://crbug.com");
// It works in common way (Fetch finished loading: GET "https://bugs.chromium.org/p/chromium/issues/list")
})();
在 manifest.json 中:
"permissions": ["<all_urls>", "webRequest", "webRequestBlocking"]
推荐阅读
- c - 为小端和大端解析网络数据
- networking - 如何正确启用和连接用于 Kubespray 的 MetalLB 插件?
- java - 为什么我的实体列表没有使用 JPA 持久化到我的 H2 数据库
- c++ - C - 获取外部 IP 地址
- python - PermissionError: [Errno 13] 使用 python 写入文本文件并使用 UE4 读取它时
- html - 如何去除卡片中的空白
- google-cloud-firestore - 如何根据用户组/角色限制对 FireStore 中文档及其所有 SUBCOLLECTIONS 的访问?(每个文档中没有组名)
- r - 将格式更改应用于列表中的所有表格
- python - python,requests,lxml:在 CSS 网格上模拟选项卡更改
- python - 有没有办法从列表中的每个项目中删除相同的字符?