首页 > 编程语言 >node.js编写反向代理转发https

node.js编写反向代理转发https

时间:2022-12-30 22:34:27浏览次数:50  
标签:node fs const res req js headers https options

node.js编写反向代理转发https

const crypto = require("crypto");
const md5 = function (str) {
    const md5 = crypto.createHash('md5');
    md5.update(str);
    return md5.digest('hex');
};
const fs = require("fs");
const url = require("url");
const path = require("path");
const http = require("https");
const options = {
    key: fs.readFileSync('./cert/cert.key'), //密钥路径
    cert: fs.readFileSync('./cert/cert.cer')
};
const server = http.createServer(options);
server.on('request', (req, res) => {
    proxy(req, res);
});
 
server.listen(443, "0.0.0.0", (error) => {
    if (error) {
        console.log('服务启动失败', error);
        return;
    }
    console.log('https 服务启动成功');
});

function replaceHTML(headers, bData) {
    if (headers['content-type'] === 'text/html; charset=utf-8') {
        var sHTML = bData.toString('utf-8');
        sHTML = sHTML.replace('</head>', '</head><script src="/test.js"></script>');
        return sHTML;
    }
    return bData;
}

function proxy(req, res) {
    const options = {};
    options.method = req.method;
    options.host = '23.220.192.115';
    options.headers = req.headers;
    options.headers['accept-encoding'] = '';
    options.path = req.url;
    const urlinfo = url.parse(req.url);
    const extname = path.extname(urlinfo.pathname);
    const savefile = path.join('data', urlinfo.pathname);
    const exts = ['.jpg', '.png', '.css', '.ico', '.map', '.ttf', '.mi', '.js'];
    const isStatic = req.method === 'GET' && urlinfo.query === null && exts.indexOf(extname) >= 0;
    if (isStatic) {
        try {
            const stat = fs.statSync(savefile);
            if (stat.isFile()) {
                try {
                    const json = JSON.parse(fs.readFileSync(savefile + '.json'));
                    res.writeHead(200, json.headers);
                    res.end(replaceHTML(json.headers, fs.readFileSync(savefile)));
                } catch (ex) {
                    res.end(replaceHTML({}, fs.readFileSync(savefile)));
                }
                return;
            }
        } catch (ex) {
            //console.log(ex);
        }
    }
    console.log(req.method, req.url);
    const r = http.request(options, (response) => {
        res.writeHead(response.statusCode, response.headers);
        const bfs = [];
        response.on('data', (bf) => {
            // 收到服务端回复的数据
            bfs.push(bf);
        });
        response.on('end', () => {
            const bf = Buffer.concat(bfs);
            if (response.statusCode === 200 && isStatic) {
                fs.mkdirSync(path.dirname(savefile), {recursive: true});
                fs.writeFileSync(savefile, bf);
                const json = {};
                json.headers = response.headers;
                fs.writeFileSync(savefile + '.json', JSON.stringify(json));
            }
            // 转发给浏览器
            res.end(replaceHTML(response.headers, bf));
        });
    });
    req.on('data', (d) => {
        // 收到浏览器的请求数据,并转发到后端服务器
        r.write(d);
    });
    req.on('end', () => {
        r.end();
    });
}

自动生成静态文件、修改html文件

 

标签:node,fs,const,res,req,js,headers,https,options
From: https://www.cnblogs.com/xiangxisheng/p/17015950.html

相关文章