일일 개발 과정에서 종종 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"),
경로 = 요구 ( "경로"),
fs = require ( "fs"),
local_folders,
base_url;
local_folders = [// 로컬 경로, 에이전트는이 목록의 디렉토리의 파일을 찾을 수 없다면 온라인 주소로 이동합니다.
"D :/작업/자산"
];
base_url = "http://10.232.133.214"; // 온라인 경로, 파일을 찾을 수없는 경우이 주소로 바꾸십시오.
함수로드 파일 (PathName, 응답) {
var i, l = local_folders.length,
fn;
Console.log ( "로드 시도" + 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) {
응답 .writehead (200);
응답 (데이터);
응답 ();
});
반품;
}
}
response.writehead (302, {
"위치": base_url + pathName
});
응답 ();
}
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) .pathname : req_url;
console.log ( " 'request' + pathname +" 'reque recep. ");
로드 파일 (PathName, 응답);
}). 듣기 (80);
위의 Local_Folders 및 Base_URL 변수의 값을 필요한 값으로 변경합니다. 예를 들어이 파일을 저장하면 Local-CDN-Proxy.js로 저장 한 다음 명령 줄에서 "Node Local-CDN-Proxy.js"를 실행하면 로컬 서버가 실행됩니다. 물론, 호스트를 바인딩하는 것을 잊지 마십시오.
HTTP를 통해 경로에 액세스 할 때 위의 스크립트는 먼저 해당 로컬 디렉토리에서 검색됩니다. 발견되면 해당 파일의 내용을 반환합니다. 찾을 수없는 경우 라인의 해당 주소로 직접 이동합니다. 찾을 수없는 상황의 경우, 그것을 다루는 또 다른 방법이 있습니다. 로컬 서버는 온라인에서 해당 콘텐츠를 다운로드하여 반환합니다. 그러나이 요구 사항의 경우 302 점프로 충분합니다.
Nodejs 버전 외에도 파이썬 버전도 작성했습니다.
코드 사본은 다음과 같습니다.
#-*-코딩 : UTF-8-*-
틀
# 저자 : Oldj
틀
OS 가져 오기
BASEHTTPSERVER 가져 오기
local_folders = [
"D :/작업/자산"
]]
base_url = "http://10.232.133.214"
클래스 WebRequestHandler (BaseHttPserver.basehttprequestHandler) :
def do_get (self) :
" '%s'요청"을 인쇄하십시오. % self.path
local_folders의 폴더의 경우 :
fn = os.path.join (폴더, self.path.replace ( "/", os.sep) [1 :])
if os.path.isfile (fn) :
self.send_response (200)
self.wfile.write (Open (fn, "rb"). read ())
부서지다
또 다른:
self.send_response (302)
self.send_header ( "위치", "%s%s"%(base_url, self.path)))
Server = basehttpserver.httpserver ((( "0.0.0.0", 80), WebRequestHandler)
server.serve_forever ()
보시다시피, Python 버전의 코드는 Nodejs 버전의 코드보다 훨씬 간단합니다.
위의 두 코드의 기능은 MIME 타입, 컨텐츠 길이 및 출력 컨텐츠가없는 기타 헤더 정보와 같은 비교적 간단하며 가능한 차단 작업 (예 : 파일 시간 초과 읽기 등)을위한 특수 처리가 수행되지 않습니다. 지역 개발 환경의 경우 이미 버전이 작동 중이며이 두 스크립트를 계속 확장하여 더 많은 요구를 충족시킬 수 있습니다.