알짜게시판

[PHP] CDN 간단히 구축하기

1. cdn.kilho.net 에 index.php 로 아래 코드를 저장 (.htaccess 로 존재하지 않는 파일은 index.php 로 연결)
2. cdn.kilho.net/{파일} 로 접속시 kilho.net/{파일} 을 다운 및 캐시로 사용합니다.

[code]
<?php
// 설정
$cfg[&#039;url&#039;] = &#039;kilho.net&#039;;
$cfg[&#039;cache&#039;] = &#039;../data/cache/&#039;;

// 메인
$url = &#039;http://&#039;.$cfg[&#039;url&#039;].$_SERVER[&#039;REQUEST_URI&#039;];
$url_arr = parse_url($url);

if($_SERVER[&#039;REQUEST_METHOD&#039;]!=&#039;GET&#039;)
{
header(&#039;HTTP/1.0 404 File Not Found.&#039;);
exit;
}

$cfg[&#039;cache&#039;] .= sha1($url_arr[&#039;host&#039;].$url_arr[&#039;path&#039;]);

$dirname = dirname($cfg[&#039;cache&#039;]);
if(!is_file($cfg[&#039;cache&#039;]))
{
if(!is_dir($dirname)) mkdir($dirname, 0707, true);

$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20061204 Firefox/2.0.0.1");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(&#039;Accpet: */*&#039;));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER[&#039;REQUEST_SCHEME&#039;].&#039;://&#039;.$cfg[&#039;url&#039;]);
$data = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

$fp = fopen($cfg[&#039;cache&#039;], &#039;w&#039;);
fwrite($fp, $info[&#039;content_type&#039;]."\n".$data);
fclose($fp);

if($info[&#039;http_code&#039;]!=200)
touch($cfg[&#039;cache&#039;], $info[&#039;http_code&#039;]);
}

$filetime = filemtime($cfg[&#039;cache&#039;]);

if($filetime<1000)
{
header(&#039;HTTP/1.0 &#039;.$filetime);
} else {
$lastmodified = filemtime($cfg[&#039;cache&#039;]);
$etag = md5_file($cfg[&#039;cache&#039;]);

header(&#039;Expires: &#039;.gmdate(&#039;D, d M Y H:i:s&#039;, time()+77760000).&#039; GMT&#039;);
header(&#039;Cache-Control: public, max-age=77760000&#039;);
header(&#039;Etag: &#039;.$etag);
header(&#039;Last-Modified: &#039;.gmdate(&#039;D, d M Y H:i:s&#039;, $lastmodified).&#039; GMT&#039;);
header(&#039;Access-Control-Allow-Origin: *&#039;); 
}

$fp = fopen($cfg[&#039;cache&#039;], &#039;rb&#039;);
$filetype = fgets($fp, 255);
header(&#039;Content-Type: &#039;.$filetype);
while(!feof($fp)) echo fread($fp, 1024);
fclose ($fp);
?>
[/code]
번호 제목 글쓴이 조회 날짜
238 [Delphi] TrayIcon 이 흐릿하게 보이는 버그? 수정 12,867 12-12
237 [Delphi] 실행 중인 프로세스가 활성 창인지 확인하는 함수 48,309 11-02
236 [Delphi] 메세지 다이어그램(Message Dialog) 에 체크박스(CheckBox) 추가 50,535 10-30
235 [그누보드] 부트스트랩 테마 예제로 사용중인 main.php 57,811 10-21
234 [그누보드] 유튜브 스킨 63,941 10-14
233 [윈도우] TLS 연결 끊김 해결 방법 - Kyber 비활성화 65,183 10-12
232 [PHP] 검색 로봇 접속시 종료 55,562 10-07
231 [윈도우] WinDivert 사용중인 어플리케이션 검색 43,627 09-12
230 [워드프레스] 답글 남기기 메시지 변경 42,038 09-05
229 [리눅스] PHP-FPM 튜닝을 위한 메모리 계산 40,540 08-29
228 [윈도우] 아이폰 벨소리 쉽게 추가하기 93,375 06-14
227 [윈도우] C:\Windows\Installer 폴더 다른 드라이브로 옮기기 103,893 05-29
226 작업 표시줄 (기타 시스템 트레이 아이콘) 제거 프로그램 108,707 05-18
225 [워드프레스] cdn.jsdelivr.net 에서 ssl 인증서 오류 문제 101,526 05-02
224 [그누보드] cdn.jsdelivr.net 에서 ssl 인증서 오류 문제 96,875 05-02
223 [PHP] REQUEST 값 받기(application/json 포함) 98,517 04-20
222 [Linux] 데몬(systemd service) 작성 및 실행하기 65,370 03-14
221 [PHP] Porto 테마에서 포스팅만 Loading Overlay 57,691 03-08
220 [그누보드] 아이디 대신 이메일로 회원 가입하기 88,234 02-02
219 [시크릿DNS] Kaspersky 백신 사용시 DNS 암호화 관련 4 98,187 01-04
218 [칼무리] 영역화면 크기 오류인 경우 121,064 12-12
217 [MySQL] 업데이트 이후 에러 발생([ERROR] Incorrect definition of table … 91,119 12-08
216 구글 크롬 탭검색 비활성화 71,845 12-04
215 [MySQL] MySQL, MariaDB 업데이트 73,296 11-24
214 [아이폰] HTTPS 감청 우회하기 204,421 11-01
213 Windows에 Rust 설치하기 57,120 10-05
212 HTTPS/DNS 차단 쉽게 이해하기 84,188 08-16
211 ChangeDNS - DNS 서버를 손쉽게 변경합니다. 75,552 08-13
210 [ReactNative] android directory was detected in the project. 65,173 07-20
209 [리눅스] 메일(Mail) 삭제/초기화 58,009 07-18
208 [Delphi] 윈도우 알림센터에 메시지 출력하기 55,226 06-20