server.js
var http = require('http');
var url = require('url');
var request = require('request');
var fs = require('fs');
http.createServer(onRequest).listen(85);
function onRequest(req, res) {
if (req.url === "/"){
fs.readFile('/index.html',function(data,err){
if (err){
console.log(err);
return res.end(err);
}
res.write(data);
res.end();
});
}
var queryData = url.parse(req.url, true).query;
if (queryData.url) {
request({
url: queryData.url
}).on('error', function(e) {
res.end(e);
}).pipe(res);
}
else {
res.end("no url found");
}
}
该程序所做的是通过在URL的末尾添加查询参数,从用户选择的远程位置获取文件,如下所示
www.myprogramdomain:85/?url=http://www.domain.com/index.html
如果我尝试进行上述投注设置url=http://us.battle.net
它会显示没有css的网页。我进入浏览器控制台,看到该页面没有任何css或javascript,因为脚本包含在本地标签中,例如'/scripts/myscript.js'等。我打算做的是从iframe中嵌入来自服务器的webdata,并在文件到来时拦截它们的请求。
问题是,在iframe内部,我如何拦截http请求并获取请求尝试发送到服务器的url。优选地作为弦。我搜索了很长时间。我甚至试图用'http://www.myprogramdomain.com:85/?url=http'替换'http'的所有实例,但由于某些网址(例如'/scripts/js.js')中没有'http'而无法正常工作。这就是为什么我希望能够拦截请求并从请求中获取URL。或者我可能希望每次从iframe发出http请求时都运行一个脚本。
我想要做的是拦截iframe内部的http请求,并将其替换为我自己的请求。
如果您需要更多解释,请不要害怕获取更多信息!
答案 0 :(得分:1)
我的理解是你正在尝试创建一个“中间人”(MITM)代理,它将拦截所有请求,可能会稍微修改它们,然后将它们转发到另一个URL。
在这种情况下,我建议您使用已经执行此操作的库。你可以google“node mitm”。我找到了这些库,你可以查看他们的api,看看他们是否提供了你需要的东西
这样您就可以转发http://myprogramdomain:85/index.html
到http://www.domain.com/index.html
但您将无法使用?url=http://www.domain.com/index.html
因为虽然这可以用于服务第一页(index.html),但任何具有相对路径(images,css)的请求都不会具有url=
,这就是为什么它在您的代码中不起作用的原因。服务器和终端服务器上的路径应该完全相同。
答案 1 :(得分:1)
您可以在文档中内联脚本和css文件!
的NodeJS:
1)索取文件 2)在文档中搜索script / css 3)请求脚本/ css文件 4)将脚本/ css文件内联到文档中 5)将文档发送给您的客户
答案 2 :(得分:1)
您可以试一下以下修改后的代码,并根据需要进一步重构。
var http = require('http');
var url = require('url');
var request = require('request');
var fs = require('fs');
http.createServer(onRequest).listen(85);
function parseCookies (req) {
var list = {},
rc = req.headers.cookie;
rc && rc.split(';').forEach(function( cookie ) {
var parts = cookie.split('=');
list[parts.shift().trim()] = decodeURI(parts.join('='));
});
return list;
}
function onRequest(req, res) {
if (req.url === "/"){
fs.readFile('/index.html',function(data,err){
if (err){
console.log(err);
return res.end(err);
}
res.write(data);
res.end();
});
}
var getExternal = function(extUrl) {
request({
url: extUrl
}).on('error', function(e) {
res.end(e);
}).pipe(res);
};
var queryData = url.parse(req.url, true).query;
if (queryData.url) {
var externalUrl = url.parse(queryData.url);
//res.cookie('externalBaseUrl', externalUrl.protocol + '//' + externalUrl.host);
res.writeHead(200, {
'Set-Cookie': 'externalBaseUrl=' + externalUrl.protocol + '//' + externalUrl.host
});
getExternal(queryData.url);
}
else {
var cookies = parseCookies(req);
if (cookies && cookies.externalBaseUrl) {
//var urlPath = url.parse(req.url).pathname;
getExternal(cookies.externalBaseUrl + req.url);
} else {
res.end("no url found");
}
}
}
我把它检查为http://localhost:85/?url=https://iiwebi.com,它像黄瓜一样酷: - )