본문

nginx의 Autoindex페이지를 파싱하여 xml로 출력하기

nginx는 autoindex 옵션이 on으로 설정된 상황에서 index페이지가 없을경우, 디렉토리의 엔트리들을 나열하는 페이지를 자동으로 생성해준다. 모양은 apache의 그것과 매우 흡사한데 동일구조인지는 아직 확인하지 않았다. 이 글은 이 페이지를 php상에서 파싱하여 xml형식의 데이터로 넘겨주는 것이다. 굳이 이런게 필요하냐 생각할 수 도 있겠지만 외부 nginx서버가 가 단순히 파일을 제공하는 역할만 하는경우에는 유용하게 사용된다.


[그림 1, 2] nginx에서의 autoindex 형태와 그를 xml로 변환한 모습.


아래에 소스를 첨부해본다. 중요포인트는 정규표현식(preg_match_all)을 사용하였다는 과 인코딩 문제때문에 iconv함수를 사용했다는 것 정도? 이소스는 dir.php?dir=Converted/Jazz 와 같이 호출하면 된다. 참고로 HttpClient.php는 HttpClient - a PHP Web Client Class 이며, http://scripts.incutio.com/httpclient/에서 관련 정보를 확인할 수 있다.
그리고 다음 게시물에서는 일반적인 php환경에서 xml형식으로 (이것과 동일한 출력으로)디렉토리 목록을 보여주는 소스를 올릴것이다


<?
header("Content-type: text/xml; charset=utf-8");
include('HttpClient.php');
$url='"#서버의 루트를 여기에 입력한다.#'.rawurlencode($_GET[dir]);
$rawData=HttpClient::quickGet($url);

preg_match('/<h1>Index of (.+)<\/h1>/', $rawData, $title);
preg_match_all('/<a href="([^"]*)">([^<]*)<\/a> +([^ ]+) ([^ ]+) +(.+)\n/', $rawData, $out, PREG_PATTERN_ORDER);

$title=iconv("CP949", "UTF-8", $title[1]);

echo "<?xml version=\"1.0\"?>\n<root dir=\"$title\">\n";
for($i=0,$total=count($out[1]); $i<$total; $i++)
{
    $href=iconv("CP949", "UTF-8", $out[1][$i]);
    $text=iconv("CP949", "UTF-8", $out[2][$i]);
    $date=$out[3][$i];
    $time=$out[4][$i];
    $attr=trim($out[5][$i]);

    if($attr=='-') $type='dir';
    else $type='file';

    echo "\t<entry type=\"$type\">\n";
    echo "\t\t<href><![CDATA[$href]]></href>\n";
    echo "\t\t<text><![CDATA[$text]]></text>\n";

    echo "\t\t<date>$date</date>\n";
    echo "\t\t<time>$time</time>\n";
    echo "\t\t<attr>$attr</attr>\n";
    echo "\t</entry>\n";
}

echo "</root>";
?>

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.