捕获所有http请求并将URL发送给父级

时间:2016-10-11 00:26:56

标签: javascript node.js

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请求,并将其替换为我自己的请求。

如果您需要更多解释,请不要害怕获取更多信息!

3 个答案:

答案 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,它像黄瓜一样酷: - )

相关问题