在项目中,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. 彻底解决TAP(点透)提升移动端点击响应速度

    使用fastclick 尼玛使用太简单了,直接一句: FastClick.attach(document.body); 于是所有的click响应速度直接提升,刚刚的!什么input获取焦点的问题也解决 ...

  2. C#获取本周、上周、本月、上月、本季度、上季度、本年、上一年起始时间和结束时间

    /// 取得某月的第一天 /// </summary> /// <param name="datetime">要取得月份第一天的时间</param&g ...

  3. RadioButton、CheckBox与ToggleButton

    1.RadioButton RadioButton被称作为单选框,通常都是以组的形式出现,可以在一组控件中选择一个. RadioButton的使用首先需要加入<RadioGroup/>,在 ...

  4. Oracle入门学习笔记

    参考文献 中文教程     http://wenku.baidu.com/view/b425f404e87101f69e319566.html 经典教程     http://wenku.baidu. ...

  5. php基础_2

    php可变变量: $a = "hello"; $$a = "world"; echo $a . $$a; 输出:hello world; current — 返 ...

  6. 使用PowerShell管理Windows8应用

    引子(?): 我从消费者预览版开始使用的win8,大概是因为我年龄不大的缘故,我很快熟悉了这个操作系统并习惯了使用windows8的Modern App.我之前使用过一个叫Windows8 Moder ...

  7. mysql导出命令

    数据库备份 /data/mysql/bin/mysqldump -hlocalhost -u'root' -p'do' my_db --single-transaction -q | gzip > ...

  8. linux dd命令

    dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 1. 命令简介 dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数 ...

  9. Cortex-M3和Cortex-M4 Fault异常应用之一 ----- 基础知识

    1. 摘要 Cortex-M内核实现了一个高效异常处理模块,可以捕获非法内存访问和数个程序错误条件.本应用笔记从程序员角度描述Cortex-M Fault异常,并且讲述在软件开发周期中的Fault用法 ...

  10. 一步一步学习SignalR进行实时通信_4_Hub

    原文:一步一步学习SignalR进行实时通信_4_Hub 一步一步学习SignalR进行实时通信\_4_Hub SignalR 一步一步学习SignalR进行实时通信_4_Hub 前言 创建Hub 配 ...