使用nodejs、Python写的一个简易HTTP静态文件服务器
日常开发过程中,我们经常需要修改一些放在CDN上的静态文件(如JavaScript、CSS、HTML文件等),这个过程中,我们希望能有一种方式将线上CDN的目录映射为本地硬盘上的某个目录,这样,当我们在本地修改了某个文件时,不需要发布,刷新后马上能看到效果。
比如,我们的CDN域名是:http://a.mycdn.com,本地对应的目录是:D:\workassets,我们希望所有对http://a.mycdn.com/*的访问被映射到本地的D:\workassets\*下。如访问http://a.mycdn.com/s/atp.js时,实际上是读取的是本地的D:\workassetss\atp.js,而不需要从网上下载线上的文件。
实现这个功能很简单,关键点如下:
1、在本地开启一个HTTP服务,监听80端口;
2、修改系统hosts文件,添加“127.0.0.1a.mycdn.com”,将CDN域名绑定为本地服务器地址;
3、配置本地HTTP服务,接收到一个GET请求后,先检查本地硬盘上是否存在对应的文件,如存在,则返回这个文件的内容,如不存在,则返回线上对应的内容。
可以看到,关键部分是需要搭建一个本地的HTTP服务。这方面有很多教程,比如在本地安装Apache或Ngnix等服务器软件,再配置相应的转发规则等。不过个人觉得这类方法还是有点复杂,本文要介绍的,是另外的不需要安装服务器软件的方法。
因为我们是在本地开发调试,对性能、并发性的要求并不高,因此我们其实并不需要一个像Apache/Ngnix这样的专业的HTTP软件,我们只需要一段能提供HTTP服务的脚本即可。比如用nodejs来实现。
/** *author:oldj * **/
varhttp=require("http"), url=require("url"), path=require("path"), fs=require("fs"), local_folders, base_url;
local_folders=[//本地路径,代理将在这个列表中的目录下寻找文件,如果没有找到则转到线上地址 "D:/work/assets" ]; base_url="http://10.232.133.214";//线上路径,如果找不到文件,则转向到这个地址
functionloadFile(pathname,response){ vari,l=local_folders.length, fn;
console.log("trytoload"+pathname);
for(i=0;i<l;i++){
fn=local_folders[i]+pathname; if(path.existsSync(fn)&&fs.statSync(fn).isFile()){ fs.readFile(fn,function(err,data){ response.writeHead(200); response.write(data); response.end(); });
return; }
}
response.writeHead(302,{ "Location":base_url+pathname }); response.end(); }
http.createServer( function(request,response){
varreq_url=request.url, pathname;
//处理类似http://a.tbcdn.cn/??p/global/1.0/global-min.css,tbsp/tbsp.css?t=20110920172000.css的请求 pathname=req_url.indexOf("??")==-1?url.parse(request.url).pathname:req_url; console.log("Requestfor'"+pathname+"'received."); loadFile(pathname,response);
}).listen(80);