簡體   English   中英

捕獲所有HTTP請求並將URL發送給父級

[英]Catch all http requests and send urls to parent

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'或其他內容。 我打算做的是將來自服務器的Web數據嵌入到iframe中,並在文件出現時攔截對文件的請求。

問題是,在iframe中,如何攔截http請求並獲取請求嘗試發送到服務器的url。 最好是字符串。 我搜索了很長時間。 我什至試圖用' http://www.myprogramdomain.com:85/?url=http '替換'http'的所有實例,但是它不能像某些URL(例如'/ scripts / js)一樣工作。 js”中沒有“ http”。 這就是為什么我希望能夠攔截請求並從請求中獲取URL。 或者,也許我想在每次從iframe發出http請求時都運行一個腳本。

我想做的是在iframe中攔截http請求並將其替換為我自己的請求。

如果您需要更多說明,請不要詢問更多信息!

據我了解,您正在嘗試創建一個“中間人”(MITM)代理,該代理將攔截所有請求,也許對其進行一些修改,然后將其轉發到另一個URL。

在這種情況下,建議您使用已經做到這一點的庫。 您可以谷歌“節點mitm”。 我找到了這些庫,您可以查看它們的api並查看它們是否提供所需的內容

這將使您能夠轉發http://myprogramdomain:85/index.html

http://www.domain.com/index.html

但您將無法使用查詢字符串參數,例如?url=http://www.domain.com/index.html

因為雖然這可以為首頁(index.html)提供服務,但是具有相對路徑(圖像,css)的任何請求都不會具有該url= ,這就是為什么它在您的代碼中不起作用的原因。 服務器和終端服務器上的路徑應完全相同。

您可以內聯文檔中的腳本和CSS文件!

的NodeJS:

1)請求文檔2)在文檔中搜索腳本/ css 3)請求腳本/ css文件4)將腳本/ css文件內聯到文檔中5)將文檔發送給客戶

您可以嘗試以下修改后的代碼,然后根據需要進一步對其進行重構。

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 ,它像黃瓜一樣酷:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM