在项目中,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. 根据树父子ID拼接无限极树结构表的名称

    declare @c varchar(50)set @c='572a3d51-ef7a-459e-a5cd-ebf0fca51e8b' --能查出来呀 你试试,我试一下,好像可以啦谢谢 declare ...

  2. 【视图】实时库存【SSKC】

    select A.pluno,A.pluname,A.qty,CASE WHEN b.QTY IS NULL THEN 0 ELSE B.QTY   END  AS XSQTY ,case when ...

  3. 在ios8上 [TableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];不起作用 经过测试加入下面方法 在ios7 8上都可以正常工作

    -(void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)] ...

  4. 解决ul显示不在div中的问题

    css样式 #banner { padding: 0px; } #banner ul { list-style: none; margin: 0px; padding: 0px; text-align ...

  5. jvm强制类型转换

    public class Integer_Object { public static void main(String[] args){ Object obj = new ooo(); // Int ...

  6. 一个Socket连接管理池(心跳机制)

    一个Socket连接管理池(心跳机制) http://cuisuqiang.iteye.com/blog/1489661

  7. Android 混淆文件project.properties和proguard-project.txt

    参考文档:http://blog.csdn.net/xueyepiaoling/article/details/8202359 http://glblong.blog.51cto.com/305861 ...

  8. mysqli扩展库的 预处理技术 mysqli stmt

    问题的提出? 现在需要向mysql数据库添加100个用户,请问如何实现? 思路: 使用for循环100次,向数据库中添加100个用户. 使用批量添加 $sql1=”insert xxx”; $ssql ...

  9. JS中如何使用Cookie

    1.关于JS设置Cookie的说明 在Javascript脚本里,一个cookie 实际就是一个字符串属性.当你读取cookie的值时,就得到一个字符串,里面当前WEB页使用的所有cookies的名称 ...

  10. Ubuntu下Geary安装

    sudo add-apt-repository ppa:yorba/ppasudo apt-get updatesudo apt-get install geary