Nodejs Electron 中使用 webRequest.onBeforeRequest 重定向请求 URL 失败
Nodejs Electron 中使用 webRequest.onBeforeRequest 重定向请求 URL 失败
如题,我想用 Electron 中 webRequest.onBeforeRequest 重定向某个网站的 swf 资源。之前用 Chrome 插件实现时,用 chrome.webRequest.onBeforeRequest.addListener 成功达到想要的效果,但是用 Electron 实现时,console.log(“Test Passed.”)
这句话可以被正常触发,但是最终加载的资源却仍然是原地址的资源。
const { app, BrowserWindow } = require('electron')
const { resolve } = require('path')
app.commandLine.appendSwitch('ppapi-flash-path', resolve(__dirname, 'pepflashplayer64_32_0_0_314.dll'))
app.commandLine.appendSwitch('ppapi-flash-version', '32.0.0.314')
function createWindow() {
win = new BrowserWindow({
autoHideMenuBar: true,
show: false,
fullscreen: false,
webPreferences: {plugins: true}
})
win.maximize()
win.webContents.openDevTools()
win.webContents.session.webRequest.onBeforeRequest(async ({url}, callback) => {
var reg = new RegExp("http://<source-domain>/test~[0-9]*.swf", 'g')
if(reg.test(url)) console.log("Test Passed.")
callback(reg.test(url) ? {redirectURL: "http://<target-domain>/test.swf"} : {})
})
win.loadURL('http://<source-domain>')
win.on('closed', () => {win = null})
}
app.on('ready', createWindow)
把调试输出那句注释掉就 work 了,神奇。
在 Node.js 和 Electron 中使用 webRequest.onBeforeRequest
来重定向请求 URL 时,如果遇到失败的情况,通常可能是因为配置不正确或者某些细节被忽略。以下是一个基本的示例代码,展示如何正确配置 webRequest.onBeforeRequest
来重定向 URL。
首先,确保你已经在 Electron 主进程中引入了 session
模块,并使用了 webRequest
拦截器。
const { app, BrowserWindow, session } = require('electron');
app.on('ready', () => {
const mainWindow = new BrowserWindow({ webPreferences: { nodeIntegration: true } });
const filter = {
urls: ['*://*/*'] // 拦截所有请求
};
session.defaultSession.webRequest.onBeforeRequest(filter, (details, callback) => {
if (details.url.includes('old-url')) {
// 重定向到新的 URL
callback({ redirectURL: 'https://new-url.com' });
} else {
// 允许请求继续
callback({});
}
});
mainWindow.loadURL('https://example.com');
});
在上述代码中,我们创建了一个 Electron 应用,并在主进程中设置了 webRequest.onBeforeRequest
监听器。这个监听器会检查请求的 URL 是否包含 'old-url'
,如果包含,则将其重定向到 'https://new-url.com'
。否则,请求将继续进行。
如果重定向失败,请检查以下几点:
- 确保
filter
配置正确,能够匹配到你想要拦截的 URL。 - 确保
details.url
中包含你期望的字符串。 - 检查是否有其他中间件或代理影响了请求。
- 查看 Electron 和 Node.js 的版本是否兼容。