毎日の開発プロセス中に、CDNに配置されたいくつかの静的ファイル(JavaScript、CSS、HTMLファイルなど)を変更する必要があることがよくあります。このプロセスでは、オンラインCDNディレクトリをローカルハードディスクのディレクトリにマッピングする方法があることを望んでいます。このようにして、ファイルをローカルに変更すると、公開する必要はなく、更新後すぐに効果を確認できます。
たとえば、CDNドメイン名はhttp://a.mycdn.comで、ローカル対応するディレクトリは次のとおりです。 http://a.mycdn.com/*へのすべてのアクセスがローカルd:/workassets/*にマッピングされることを願っています。たとえば、http://a.mycdn.com/s/atp.jsにアクセスする場合、インターネットからオンラインファイルをダウンロードせずにローカルd:/workassetss/atp.jsを実際に読んでください。
この関数を実装するのは非常に簡単です。キーポイントは次のとおりです。
1. HTTPサービスをローカルに開き、ポート80を聴きます。
2.システムホストファイルを変更し、「127.0.0.1 a.mycdn.com」を追加し、CDNドメイン名をローカルサーバーアドレスにバインドします。
3.ローカルHTTPサービスを構成します。 GETリクエストを受信した後、対応するファイルがローカルハードディスクに存在するかどうかを確認します。存在する場合は、ファイルのコンテンツを返します。存在しない場合は、対応するコンテンツをライン上のコンテンツを返します。
ご覧のとおり、重要な部分はローカルHTTPサービスを構築することです。この点では、ApacheやNGNIXなどのサーバーソフトウェアをローカルにインストールしたり、対応する転送ルールの構成など、多くのチュートリアルがあります。しかし、私は個人的には、この方法はまだ少し複雑だと思います。この記事で紹介したいのは、サーバーソフトウェアのインストールを必要としない別の方法です。
私たちはローカルで開発およびデバッグしているため、パフォーマンスと並行性に関する高い要件はないため、実際にはApache/NGNIXのようなプロフェッショナルなHTTPソフトウェアは必要ありません。 HTTPサービスを提供できるスクリプトのみが必要です。たとえば、nodejsを使用して実装します。
コードコピーは次のとおりです。
/**
*著者:oldj
*
**/
var http = require( "http")、
url = require( "url")、
パス= 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( "load" + pathname);
for(i = 0; i <l; i ++){
fn = local_folders [i] + pathname;
if(path.existsync(fn)&& fs.statsync(fn).isfile()){
fs.readfile(fn、function(err、data){
Response.Writehead(200);
Response.write(data);
Response.End();
});
戻る;
}
}
Response.writehead(302、{
「場所」:base_url + pathname
});
Response.End();
}
http.createserver(
関数(リクエスト、応答){
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).puthname:req_url;
console.log( "要求 '" + pathname + "' recomed");
loadfile(pathname、response);
})。聞きます(80);
上記のlocal_foldersとbase_url変数の値を必要な値に変更することに注意してください。たとえば、このファイルを保存して、local-cdn-proxy.jsとして保存し、コマンドラインで "node local-cdn-proxy.js"を実行すると、ローカルサーバーが実行されます。もちろん、ホストをバインドすることを忘れないでください。
HTTPを介してパスにアクセスするとき、上記のスクリプトは、最初に対応するローカルディレクトリで最初に検索します。見つかった場合、対応するファイルのコンテンツを返します。発見されていない場合、ライン上の対応するアドレスに直接ジャンプします。それが見つからない状況には、それに対処する別の方法があります。ローカルサーバーは、対応するコンテンツをオンラインからダウンロードして返します。ただし、この要件では、302ジャンプで十分です。
NodeJSバージョンに加えて、Pythonバージョンも書きました。
コードコピーは次のとおりです。
# - * - コーディング:UTF-8-* -
#
#著者:oldj
#
OSをインポートします
basehttpserverをインポートします
local_folders = [
「d:/work/assets」
]
base_url = "http://10.232.133.214"
クラスWebRequestHandler(basehttpserver.basehttprequesthandler):
def do_get(self):
「受信した「%s」のリクエスト」を印刷します。 %self.path
local_foldersのフォルダーの場合:
fn = os.path.join(folder、self.path.replace( "/"、os.sep)[1:])
os.path.isfile(fn)の場合:
self.send_response(200)
self.wfile.write(open(fn、 "rb")。read()))
壊す
それ以外:
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バージョンのコードよりもはるかに簡単です。
上記の2つのコードの機能は、MIMEタイプ、コンテンツレングス、および出力コンテンツのないその他のヘッダー情報など、比較的単純であり、ブロッキング操作の可能性について特別な処理は行われません(ファイルタイムアウトの読み取りなど)。ローカル開発環境の場合、それらはすでに機能しているバージョンであり、より多くのニーズを満たすためにこれら2つのスクリプトを拡張し続けることができます。