Dalam proses pembangunan harian, kami selalunya perlu mengubah suai beberapa fail statik (seperti JavaScript, CSS, fail HTML, dll.) yang diletakkan pada CDN Dalam proses ini, kami berharap mempunyai cara untuk memetakan CDN dalam talian direktori ke tempatan Direktori pada cakera keras, supaya apabila kami mengubah suai fail secara setempat, tidak perlu menerbitkannya, dan kesannya dapat dilihat serta-merta selepas menyegarkan.
Sebagai contoh, nama domain CDN kami ialah: http://a.mycdn.com, dan direktori tempatan yang sepadan ialah: D:workassets Kami berharap semua akses kepada http://a.mycdn.com/*. akan dipetakan Pergi ke D:workassets* setempat. Contohnya, apabila anda melawati http://a.mycdn.com/s/atp.js, anda sebenarnya membaca D:workassetssatp.js tempatan tanpa memuat turun fail dalam talian daripada Internet.
Sangat mudah untuk melaksanakan fungsi ini, perkara utama adalah seperti berikut:
1. Buka perkhidmatan HTTP secara setempat dan dengarkan port 80;
2. Ubah suai fail hos sistem, tambah "127.0.0.1 a.mycdn.com", dan ikat nama domain CDN ke alamat pelayan setempat;
3. Konfigurasikan perkhidmatan HTTP tempatan Selepas menerima permintaan GET, semak dahulu sama ada fail yang sepadan wujud pada cakera keras tempatan Jika ia wujud, kandungan fail tersebut akan dikembalikan akan dikembalikan.
Seperti yang anda lihat, bahagian penting ialah membina perkhidmatan HTTP tempatan. Terdapat banyak tutorial dalam kawasan ini, seperti memasang perisian pelayan seperti Apache atau Ngnix secara tempatan, dan kemudian mengkonfigurasi peraturan pemajuan yang sepadan. Walau bagaimanapun, saya secara peribadi merasakan bahawa kaedah ini masih agak rumit. Apa yang akan diperkenalkan oleh artikel ini adalah kaedah lain yang tidak memerlukan pemasangan perisian pelayan.
Oleh kerana kami sedang membangun dan menyahpepijat secara tempatan, keperluan untuk prestasi dan keselarasan adalah tidak tinggi, jadi kami sebenarnya tidak memerlukan perisian HTTP profesional seperti Apache/Ngnix, kami hanya memerlukan skrip yang boleh menyediakan perkhidmatan HTTP Itu sahaja. Sebagai contoh, gunakan nodejs untuk melaksanakannya.
laluan = memerlukan("laluan"),
fs = memerlukan("fs"),
local_folders,
base_url;
local_folders = [ // Laluan setempat, ejen akan mencari fail dalam direktori dalam senarai ini, dan jika tidak ditemui, pergi ke alamat dalam talian
];
base_url = "http://10.232.133.214"; // Laluan dalam talian, jika fail tidak ditemui, ubah hala ke alamat ini
var i, l = local_folders.length,
fn;
console.log("cuba muatkan " nama laluan);
untuk (i = 0; i < l; i ) {
fn = local_folders[i] nama laluan;
jika (path.existsSync(fn) && fs.statSync(fn).isFile()) {
fs.readFile(fn, fungsi (err, data) {
Response.writeHead(200);
Response.write(data);
Response.end();
});
kembali;
}
response.writeHead(302, {
"Lokasi":base_url nama laluan
});
response.end();
}
http.createServer(
var req_url = request.url,
// Memproses permintaan serupa dengan http://a.tbcdn.cn/??p/global/1.0/global-min.css,tbsp/tbsp.css?t=20110920172000.css
console.log("Permintaan untuk '" nama laluan "' diterima.");
loadFile(nama laluan, respons);
}).dengar(80);
Apabila mengakses laluan melalui http, skrip di atas akan terlebih dahulu mencari dalam direktori tempatan yang sepadan Jika ditemui, ia akan mengembalikan kandungan fail yang sepadan Jika ia tidak ditemui, ia akan terus 302 melompat ke dalam talian yang sepadan alamat. Untuk situasi di mana ia tidak dapat ditemui, penyelesaian lain ialah meminta pelayan tempatan memuat turun kandungan yang sepadan dari dalam talian dan mengembalikannya, tetapi untuk keperluan ini, lompatan 302 sudah memadai.
Sebagai tambahan kepada versi nodejs, saya juga menulis versi Python:
os import
import BaseHTTPServer
LOCAL_FOLDERS = [
"D:/kerja/aset"
]
BASE_URL = "http://10.232.133.214"
kelas WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
cetak "Permintaan untuk '%s' diterima." % laluan diri
untuk folder dalam LOCAL_FOLDERS:
fn = os.path.join(folder, self.path.replace("/", os.sep)[1:])
jika os.path.isfile(fn):
diri.send_response(200)
self.wfile.write(open(fn, "rb").read())
putus
lain:
self.send_response(302)
self.send_header("Lokasi", "%s%s" % (BASE_URL, self.path))
pelayan = BaseHTTPServer.HTTPServer(("0.0.0.0", 80), WebRequestHandler)
server.serve_forever()
可以看到,Python 版本的代码比 nodejs 版本的精简了很多。
上面的两段代码的功能还相对比较简单,比如没有输出内容的 MIME-Type、Content-Length、Content-Length、Content-Length操作(如读取文件超时等)也没有做特别的处理。对于本地开发环境来说,它们已经是可以工作的版本了,你也可以继续扩展这这他多的需求。