[英]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.