使用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:workassetssatp.js,而不需要从网上下载线上的文件。 实现这个功能很简单,关键点如下: 1、在本地开启一个 HTTP 服务,监听 80 端口; 可以看到,关键部分是需要搭建一个本地的 HTTP 服务。这方面有很多教程,比如在本地安装 Apache 或 Ngnix 等服务器软件,再配置相应的转发规则等。不过个人觉得这类方法还是有点复杂,本文要介绍的,是另外的不需要安装服务器软件的方法。 因为我们是在本地开发调试,对性能、并发性的要求并不高,因此我们其实并不需要一个像 Apache/Ngnix 这样的专业的 HTTP 软件,我们只需要一段能提供 HTTP 服务的脚本即可。比如用 nodejs 来实现。 复制代码 代码如下: /** * author: oldj * **/ var http = require("http"), local_folders = [ // 本地路径,代理将在这个列表中的目录下寻找文件,如果没有找到则转到线上地址
console.log("try to load " + pathname); for (i = 0; i < l; i++) { fn = local_folders[i] + pathname; return; } response.writeHead(302,{ http.createServer( var req_url = request.url, // 处理类似 http://a.tbcdn.cn/??p/global/1.0/global-min.css,tbsp/tbsp.css?t=20110920172000.css 的请求 }).listen(80);
当通过 http 访问一个路径时,上面的脚本会先在本地对应的目录下查找,找到则返回对应文件的内容,找不到则直接 302 跳转到线上对应的地址。对于找不到的情况,还有一种处理办法是由本地服务器从线上下载对应的内容并返回,不过对这个需求来说,302 跳转就足够了。 除了 nodejs 版本,我也写了一个 Python 的版本: 复制代码 代码如下: # -*- coding: utf-8 -*- # # author: oldj # import os LOCAL_FOLDERS = [ class WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(self): else: server = BaseHTTPServer.HTTPServer(("0.0.0.0",80),WebRequestHandler)
上面的两段代码的功能还相对比较简单,比如没有输出内容的 MIME-Type、Content-Length 等头信息,对可能的阻塞操作(如读取文件超时等)也没有做特别的处理。对于本地开发环境来说,它们已经是可以工作的版本了,你也可以继续扩展这两个脚本,以便满足更多的需求。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- python – 使用MultiIndex的Pandas数据框:检查字符串是否包
- 检查图片是否损坏、图片后缀是否与实际图片类型对应 - Pyth
- python – 用于viewset视图的Django Rest Framework自定义
- python机器学习库常用汇总
- python – 如何在DataFrame中增加groupby中的行数
- Python的Tornado框架异步编程入门实例
- python – cPickle.UnpicklingError:无效的加载密钥
- day51:django:dispatch&模板渲染&过滤器&标签&
- django – 如何保护我的网络游戏免受骗子的侵害?
- Python中的装饰器用法详解