日常开发过程中,我们经常需要修改一些放在 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.1 a.mycdn.com”,将 CDN 域名绑定为本地服务器地址;
3、配置本地 HTTP 服务,接收到一个 GET 请求后,先检查本地硬盘上是否存在对应的文件,如存在,则返回这个文件的内容,如不存在,则返回线上对应的内容。
可以看到,关键部分是需要搭建一个本地的 HTTP 服务。这方面有很多教程,比如在本地安装 Apache 或 Ngnix 等服务器软件,再配置相应的转发规则等。不过个人觉得这类方法还是有点复杂,本文要介绍的,是另外的不需要安装服务器软件的方法。
因为我们是在本地开发调试,对性能、并发性的要求并不高,因此我们其实并不需要一个像 Apache/Ngnix 这样的专业的 HTTP 软件,我们只需要一段能提供 HTTP 服务的脚本即可。比如用 nodejs 来实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
/**
* author: oldj
* blog: http://oldj.net
*
**/
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("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){
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("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 的版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# -*- coding: utf-8 -*-
#
# author: oldj
# blog: http://oldj.net
#
importos
importBaseHTTPServer
LOCAL_FOLDERS=[
"D:/work/assets"
]
BASE_URL="http://10.232.133.214"
classWebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
defdo_GET(self):
print"Request for '%s' received."%self.path
forfolder inLOCAL_FOLDERS:
fn=os.path.join(folder,self.path.replace("/",os.sep)[1:])
ifos.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 等头信息,对可能的阻塞操作(如读取文件超时等)也没有做特别的处理。对于本地开发环境来说,它们已经是可以工作的版本了,你也可以继续扩展这两个脚本,以便满足更多的需求。
分享到:
相关推荐
"如何将网盘映射为本地磁盘" 在这篇文章中,我们将讨论如何将网盘映射为本地磁盘,以便更方便地...*否则您在WEB管理器中将看不到文件的更改。 通过将网盘映射为本地磁盘,可以更方便地管理文件,从而提高工作效率。
本文将详细介绍如何利用ArcGIS软件中的Toolbox功能,通过“邻近点批量移动到线上”的方法来实现这一操作。 #### 一、准备工作 在开始之前,确保已经安装了ArcGIS Desktop软件,并且熟悉其基本操作界面。此外,还...
Spring Boot 路径映射的实现 Spring Boot 路径映射是指在 Spring Boot 应用程序中将 URL 请求映射到对应的 HTML 文件的过程。...这些方法可以帮助我们在 Spring Boot 应用程序中轻松地实现路径映射,并提高开发效率。
里面是一个写好的代码,可以在windows内核dos路径转NT路径,值得拥有
Tomcat 配置虚拟路径是指在 Tomcat 中设置一个虚拟目录,使得项目的目录映射到 Tomcat 中,从而实现项目的部署和管理。上传图片到虚拟路径是指将图片上传到虚拟目录中,以便于项目中的图片资源的管理和使用。 虚拟...
本文介绍了html5中将图片的绝对路径转换成文件对象,分享给大家,具体如下: 将图片的绝对路径转换成base64编码,请看这篇文章 我们先来理解基本知识点: 1. 理解HTML5中的FileList对象与file对象。 在HTML5中,...
"相对路径转换工具.exe" 是一个实用程序,它能够将绝对路径转换为相对路径,这对于在不同环境或在代码中处理路径时非常有用。这个工具可能采用了某种算法,分析输入的绝对路径,并根据当前目录计算出相应的相对路径...
ASP(Active Server Pages)是微软公司开发的一种服务器端脚本环境,用来创建动态交互式网页。在ASP中处理文件路径时,区分相对路径和绝对路径非常重要。相对路径是相对于当前页面或其他文件的位置来指定文件路径的...
在安装完成后,需要配置环境变量,包括配置classpath和添加Java 6安装目录中的bin目录路径到系统的Path变量中。这样可以使Java 6环境生效。 配置完成后,可以在命令行模式下输入java命令,查看Java 6环境是否安装...
1. 文件夹映射的基本概念:文件夹映射是指在计算机系统中将一个网络位置(如共享文件夹)映射为本地计算机上的一个虚拟驱动器,这样用户就可以像访问本地文件一样访问远程资源,提高工作效率。这种映射通常通过创建...
在Java编程语言中,将SQL数据库中的数据映射到JSON(JavaScript Object Notation)格式是一项常见的任务,特别是在Web服务和API开发中。JSON作为一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器...
本文旨在详细介绍如何在Eclipse Web Tools Platform(WTP)下配置Steps开发环境,这不仅涉及到基本的库文件集成、服务器与版本控制系统的配置,还涉及编码设置及构建路径的优化,确保开发流程顺畅无阻。 #### 二、...
- 计算从源节点到邻居节点的新路径长度,即当前节点的最短路径长度加上与邻居节点之间的边的权重。 - 如果新路径长度小于邻居节点已知的最短路径长度,则更新邻居节点的最短路径长度和前驱节点(即到达该节点的上...
本文详细介绍了在CMake中处理跨平台路径问题的方法,包括CMake提供的路径处理函数、如何使用环境变量中的路径、避免硬编码路径的实践,以及在安装规则中应用跨平台路径。通过实际的代码示例,本文旨在帮助读者掌握在...
在地理信息系统(GIS)领域,路径距离分析是一项非常重要的技术,特别是在环境规划、资源管理、灾害响应等领域有着广泛的应用。本教程将深入探讨如何使用ArcGIS软件中的“路径距离”工具,帮助用户理解和掌握如何...
势力场路径规划是一种在复杂环境中为移动机器人或自动驾驶车辆寻找最优路径的方法,它结合了物理中的势能场和动能场概念。在这个系统中,目标点被视为引力场的源,而障碍物则产生斥力场。通过计算这两个场的叠加,...
标题“将当前目录加入到系统路径”涉及到的是操作系统中的环境变量设置,特别是关于PATH环境变量的修改。在大多数操作系统中,PATH环境变量包含了系统能够直接执行的可执行文件的目录列表。当我们希望在任何地方都能...