在项目中,ssi include是一个比较常用的功能,这样我们就可以通过web服务器的支持,将公用的html提取出来,改一个文件就会修改全部内容

但是这也带来了问题,在开发的时候没办法的刷新查看,需要提交测试服务器才可以,当然也可以通过在本地通过nginx服务器做到这些。

现在我们有了nodejs,github上面也有很多好的本地代理项目,anyproxy,whistle,livepool...

平时主要用 whistle 操作配置上面都很简单,通过简单配置也可以实现很多功能

livepool,装了下,看着想fiddler,操作起来主要感觉主要是界面操作,就没怎么用

anyproxy,这个是需要自己写js,定义规则的,灵活性好些,但是写代码总归麻烦的

今天通过对比,感觉anyproxy实现node ssi功能比较简单些,其实也很简单,详见代码 时间有限,都是通过同步api写的,略有遗憾

/*
  read the following wiki before using rule file
  https://github.com/alibaba/anyproxy/wiki/What-is-rule-file-and-how-to-write-one
*/
"use strict";
const fs = require('fs');
const url = require("url");
const path = require("path");
var _getNewFPath = function (newUrl) {
var urlObject = url.parse(newUrl, true);
return path.join(this.hostFilePath, urlObject.pathname);
}
const config = [
{
urlInclude: 'http://mall.snail.com/pickCard/',
hostFilePath: 'D:/snailshop/mall-snail-com/mall',
ssi: true,
getNewFPath: function (newUrl) {
var urlObject = url.parse(newUrl, true);
if (newUrl.indexOf('http://mall.snail.com/includes/') != -1) {
return path.join('D:/snailshop/mall-snail-com/', urlObject.pathname);
}
return path.join(this.hostFilePath, urlObject.pathname);
}
},
{
urlInclude: 'http://static.snail.com/',
hostFilePath: 'D:/snailshop/mall-snail-com/public',
getNewFPath: _getNewFPath
}
]; var map = {};
var ssiReadFile = function (reqUrl, ssiOpt) {
map = {};
return _ssiReadFile(reqUrl, ssiOpt, [])
};
var _ssiReadFile = function (reqUrl, ssiOpt, accessPath) {
var readFPath = ssiOpt.getNewFPath(reqUrl);
console.log('_ssiReadFile1', readFPath)
var stat = fs.statSync(readFPath);
var content;
if (stat && stat.isFile()) {
content = fs.readFileSync(readFPath, {encoding: 'utf8'});
var match = content.match(/<!--#\s*include\s+file=(["']).+?\1\s*-->/g);
console.log('_ssiReadFile2', match);
if (match) {
match.forEach((m) => {
var fileStr = m.match(/<!--#\s*include\s+file=(["'])(.+?)\1\s*-->/)[2];
var newUrl = url.resolve(reqUrl, fileStr);
if (accessPath.indexOf(newUrl) != -1) {//存在循环
map[newUrl] = "loop " + newUrl +' in [ '+ accessPath.join() + ']';
} else if (!map[newUrl]) {
var _access = accessPath.slice(0);
_access.push(newUrl);
map[newUrl] = _ssiReadFile(newUrl, ssiOpt, _access);
}
})
content = content.replace(/<!--#\s*include\s+file=(["'])(.+?)\1\s*-->/g, function (a, b, fileStr) {
var newUrl = url.resolve(reqUrl, fileStr);
return map[newUrl];
});
}
} else {
content = 'not find file ' + readFPath;
}
return content;
} module.exports = {
summary: function(){
return "mall 项目";
},
replaceRequestOption : function(req, option){
var host = option.headers.host;
if(host == "mall.snail.com" || host == "static.snail.com" || host == "m.mall.snail.com"){
option.hostname = "10.13.0.206";
option.port = "80";
} else if (host == "mobile.snail.com" || host == "m.mobile.snail.com"){
option.hostname = "10.13.0.205";
option.port = "80";
} else if (host == "cmsv3.snailsite.com"){
option.hostname = "10.110.1.3";
option.port = "80";
} return option;
},
shouldInterceptHttpsReq :function(req){
return false;
},
shouldUseLocalResponse : function(req, reqBody){
var reqUrl = req.url;
var urlObject = url.parse(reqUrl, true);
for (var i = 0, len = config.length; i < len ; i++) {
let opt = config[i];
if (reqUrl.indexOf(opt.urlInclude) != -1) {
let newPath = path.join(opt.hostFilePath, urlObject.pathname);
let stat = fs.statSync(newPath);
if (stat && stat.isFile()) {
console.log('shouldUseLocalResponse', newPath)
req.ssi = opt.ssi || false;
req.ssiOpt = opt;
return true;
}
}
}
return false;
}, dealLocalResponse : function(req, reqBody, callback){
console.log('dealLocalResponse', req.ssi);
if (req.ssi) {
callback(200, {"content-type": "text/html"}, ssiReadFile(req.url, req.ssiOpt));
} else {
callback(200, {}, fs.readFileSync(req.ssiOpt.getNewFPath(req.url)));
}
delete req.ssiOpt;
delete req.ssi;
}
};

node anyproxy ssi简易支持的更多相关文章

  1. 使用Node.js实现简易MVC框架

    在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...

  2. [转] 使用Node.js实现简易MVC框架

    在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...

  3. node.js 开发简易的小爬虫

    node.js  开发简易的小爬虫 最近公司开发一款医药类的软件,所以需要一些药品的基础数据,所以本人就用node.js写一个简易的小爬虫,并写记录这个Demo以供大家参考. 一.开发前的准备: 1, ...

  4. 在Apache下开启SSI配置支持include shtml html和快速配置服务器

    作为前端开发,使用Apache快速搭建服务器极为方便. 1.找到apach安装目录,找到conf目录下 的httpd.conf 使用SSI(Server Side Include)的html文件扩展名 ...

  5. 《基于Node.js实现简易聊天室系列之详细设计》

    一个完整的项目基本分为三个部分:前端.后台和数据库.依照软件工程的理论知识,应该依次按照以下几个步骤:需求分析.概要设计.详细设计.编码.测试等.由于缺乏相关知识的储备,导致这个Demo系列的文章层次 ...

  6. Node 7.6默认支持Async/Await

    Node.js 7.6正式默认支持async/await功能,并能够使低内存设备获得更出色的性能. Node 7.6对async/await的支持来自于将V8(Chromium JavaScript引 ...

  7. 利用es-checker检测当前node对ES6的支持情况

    ode.js发展非常快,对es6特性的支持也越来越良心,但node.js版本很多,各版本对es6的支持度都不一样,为了能清晰的了解各版本对es6特性的支持,需要有一个工具能提供比较清晰的支持说明,甚至 ...

  8. node.js + mssql 简易封装操作

    时间吧,总是这么凑巧,在我学习[node.js]还没几天,我的 Microsoft SQL Server Management Studio 18 就歇菜了,至于怎么歇菜的吧....它可能的意思就是想 ...

  9. Node.js搭建简易用户登录

    根据学习笔记一的知识点搭建的简易用户注册登录模块,用户数据暂用json保存. HTML: <!DOCTYPE html> <html lang="en" dir= ...

随机推荐

  1. UVA1600 Patrol Robot

    题意: 求机器人走最短路线,而且可以穿越障碍.N代表有N行,M代表最多能一次跨过多少个障碍. 分析: bfs()搜索,把访问状态数组改成了3维的,加了个维是当前能跨过的障碍数. 代码: #includ ...

  2. SVN(一次检出&二次检出)

    一次检出: >进入经历文件夹 >输入svn checkout指令 >输入电脑密码 >输入用户名 >输入密码 >检出成功 第二次检出: >进入小涛文件夹 > ...

  3. vim命令杂记

    vim 实用命令. . . 命令重复上一次修改动作 >G 增加当前行到文档末尾处的缩进 C 相当于c$,更改当前位置 至 行尾的单词 S 相当于^c , 更改一行 : 重复上次的f命令所查找的字 ...

  4. windows系统——mysql自动定时备份数据库的最佳方法

    网上有很多关于window下Mysql自动备份的方法,可是真的能用的也没有几个,有些说的还非常的复杂,难以操作. 我们都知道mssql本身就自带了计划任务可以用来自动备份,可是mysql咱们要怎么样自 ...

  5. Android 自定义EditText实现粘贴,复制,剪切的监听

    package com.dwtedx.qq.view; import android.annotation.SuppressLint; import android.content.Context; ...

  6. 预定义异常 - PHP手册笔记

    Exception是所有异常的基类,类摘要如下: <?php class Exception { protected string $message; // 异常消息内容 protected i ...

  7. scikit-learn的主要模块和基本使用

    1.加载数据(Data Loading) 假设输入是特征矩阵或者csv文件,首先数据被载入内存. scikit-learn的实现使用了NumPy中的arrays,所以,使用NumPy来载入csv文件. ...

  8. Visual Studio Code和Docker开发asp.net core和mysql应用

    Visual Studio Code和Docker开发asp.net core和mysql应用 .net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对 ...

  9. W5300E01-ARM 交叉编译器(Cross Compiler)用户手册

    W5300E01-ARM是基于W5300的ARM功能测试评估板: 1      简介 当用户的开发环境与目标系统不同时就会用到交叉编译器. 例如,当开发基于ARM的嵌入式系统时,用户就需要在电脑上写出 ...

  10. U-boot中实现Yaffs2+HwEcc

    经过老手的指点,要实现Yaffs2+HwEcc,重点在于chip->ops.mode由MTD_OOB_RAW到MTD_OOB_AUTO.经过几天的筹备,今天要对其下手了.为了真实展现分析移植过程 ...