Durante el proceso de desarrollo diario, a menudo necesitamos modificar algunos archivos estáticos colocados en el CDN (como JavaScript, CSS, archivos HTML, etc.). En este proceso, esperamos tener una forma de mapear el directorio CDN en línea a un directorio en el disco duro local. De esta manera, cuando modificamos un archivo localmente, no necesitamos publicarlo, y podemos ver el efecto inmediatamente después de la actualización.
Por ejemplo, nuestro nombre de dominio CDN es: http://a.mycdn.com, y el directorio local correspondiente es: D:/Workassets. Esperamos que todos los accesos a http://a.mycdn.com/* se asignen al local d:/workassets/*. Por ejemplo, al visitar http://a.mycdn.com/s/atp.js, realmente lee el local D: /workassets/atp.js sin descargar archivos en línea de Internet.
Es muy simple implementar esta función, los puntos clave son los siguientes:
1. Abra un servicio HTTP localmente y escuche el puerto 80;
2. Modifique el archivo de hosts del sistema, agregue "127.0.0.1 a.mycdn.com" y vincule el nombre de dominio CDN a la dirección del servidor local;
3. Configure el servicio HTTP local. Después de recibir una solicitud GET, verifique si el archivo correspondiente existe en el disco duro local. Si existe, devuelva el contenido del archivo. Si no existe, devuelva el contenido correspondiente en la línea.
Como puede ver, la parte clave es construir un servicio HTTP local. Hay muchos tutoriales a este respecto, como la instalación de software del servidor como Apache o Ngnix localmente, y luego configurar las reglas de reenvío correspondientes. Sin embargo, personalmente creo que este método sigue siendo un poco complicado. Lo que quiero presentar en este artículo es otro método que no requiere la instalación del software del servidor.
Debido a que estamos desarrollando y depurando localmente, no tenemos altos requisitos para el rendimiento y la concurrencia, por lo que en realidad no necesitamos un software HTTP profesional como Apache/NGNIX. Solo necesitamos un script que pueda proporcionar servicios HTTP. Por ejemplo, use NodeJS para implementarlo.
La copia del código es la siguiente:
/**
* Autor: OldJ
*
**/
var http = require ("http"),
url = requerir ("url"),
ruta = requerir ("ruta"),
fs = requerir ("fs"),
local_folders,
base_url;
local_folders = [// ruta local, el agente buscará el archivo en el directorio en esta lista, si no se encuentra, vaya a la dirección en línea
"D:/trabajo/activos"
];
base_url = "http://10.232.133.214"; // ruta en línea, si el archivo no se puede encontrar, luego pase a esta dirección
function loadFile (PathName, Respuesta) {
var i, l = local_folders.length,
fn;
console.log ("intente cargar" + rathName);
para (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);
respuesta.write (datos);
respuesta.end ();
});
devolver;
}
}
Response.Writehead (302, {
"Ubicación": Base_url + PathName
});
respuesta.end ();
}
http.createServer (
función (solicitud, respuesta) {
var req_url = request.url,
nombre de ruta;
// manejar solicitudes similares a 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 ("Solicitar '" + PathName + "' Recibido");
loadFile (ratyName, respuesta);
}). Escuchar (80);
Tenga en cuenta que cambia los valores de las variables locales_folders y base_url anteriores a los valores que necesita. Guarde este archivo, por ejemplo, guárdelo como local-cdn-proxy.js, y luego ejecute "nodo local-cdn-proxy.js" en la línea de comando, y el servidor local se ejecutará. Por supuesto, no olvides vincular a los hosts.
Al acceder a una ruta a través de HTTP, el script anterior primero buscará en el directorio local correspondiente. Si se encuentra, devolverá el contenido del archivo correspondiente. Si no se encuentra, saltará directamente a la dirección correspondiente en la línea. Para situaciones en las que no se puede encontrar, hay otra forma de lidiar con eso. El servidor local descarga el contenido correspondiente desde el en línea y lo devuelve. Sin embargo, para este requisito, un salto 302 es suficiente.
Además de la versión NodeJS, también escribí una versión de Python:
La copia del código es la siguiente:
#-*-Codificación: UTF-8-*-
#
# Autor: OldJ
#
importar sistema operativo
importar basehttpserver
Local_folders = [
"D:/trabajo/activos"
]
Base_url = "http://10.232.133.214"
Class WebRequestHandler (BaseHttpserver.BaseHttpRequestHandler):
Def do_get (self):
Imprima "Solicitud de '%s' recibida". % self.path
Para la carpeta en local_folders:
fn = os.path.join (carpeta, self.path.replace ("/", os.sep) [1:])
Si OS.Path.ISFILE (FN):
self.send_esponse (200)
self.wfile.write (abierto (fn, "rb"). Read ())
romper
demás:
self.send_esponse (302)
self.send_header ("ubicación", "%s%s"%(base_url, self.path))
servidor = basehttpserver.httpserver (("0.0.0.0", 80), WebRequestHandler)
servidor.serve_forever ()
Como puede ver, el código en la versión de Python es mucho más simple que el de la versión NodeJS.
Las funciones de los dos códigos anteriores son relativamente simples, como la información de tipo MIME de tipo MIME, longitud de contenido y otra de encabezado sin contenido de salida, y no se realiza un procesamiento especial para posibles operaciones de bloqueo (como el tiempo de espera del archivo de lectura, etc.). Para los entornos de desarrollo locales, ya están trabajando versiones, y puede continuar extendiendo estos dos scripts para satisfacer más necesidades.