文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用nodejs、Python写的一个简易HTTP静态文件服务器

2022-06-04 01:35

关注

日常开发过程中,我们经常需要修改一些放在 CDN 上的静态文件(如 JavaScript、CSS、HTML 文件等),这个过程中,我们希望能有一种方式将线上 CDN 的目录映射为本地硬盘上的某个目录,这样,当我们在本地修改了某个文件时,不需要发布,刷新后马上能看到效果。

比如,我们的 CDN 域名是:http://a.mycdn.com,本地对应的目录是:D:workassets,我们希望所有对 http://a.mycdn.com

var http = 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"; // 线上路径,如果找不到文件,则转向到这个地址

function loadFile(pathname, response) { var i, l = local_folders.length, fn;

console.log("try to load " + 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) {

var req_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("Request for '" + pathname + "' received."); loadFile(pathname, response);

}).listen(80);


注意将上面的 local_folders 和 base_url 两个变量的值修改为你需要的值。将这个文件保存下来,比如保存为 local-cdn-proxy.js,然后在命令行里执行“node local-cdn-proxy.js”,本地服务器就运行起来了,当然,别忘了绑定 hosts 。

当通过 http 访问一个路径时,上面的脚本会先在本地对应的目录下查找,找到则返回对应文件的内容,找不到则直接 302 跳转到线上对应的地址。对于找不到的情况,还有一种处理办法是由本地服务器从线上下载对应的内容并返回,不过对这个需求来说,302 跳转就足够了。

除了 nodejs 版本,我也写了一个 Python 的版本:

# -*- coding: utf-8 -*-

#

# author: oldj

#

import os import BaseHTTPServer

LOCAL_FOLDERS = [ "D:/work/assets" ] BASE_URL = "http://10.232.133.214"

class WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

def do_GET(self): print "Request for '%s' received." % self.path for folder in LOCAL_FOLDERS: fn = os.path.join(folder, self.path.replace("/", os.sep)[1:]) if os.path.isfile(fn): self.send_response(200) self.wfile.write(open(fn, "rb").read()) break

else: self.send_response(302) self.send_header("Location", "%s%s" % (BASE_URL, self.path))

server = BaseHTTPServer.HTTPServer(("0.0.0.0", 80), WebRequestHandler) server.serve_forever()


可以看到,Python 版本的代码比 nodejs 版本的精简了很多。

上面的两段代码的功能还相对比较简单,比如没有输出内容的 MIME-Type、Content-Length 等头信息,对可能的阻塞操作(如读取文件超时等)也没有做特别的处理。对于本地开发环境来说,它们已经是可以工作的版本了,你也可以继续扩展这两个脚本,以便满足更多的需求。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯