lighttpd에서 mod_negotiation 흉내내기
최근에 생긴 넷북에 개발 환경을 설치하고 있는데 아파치가 무거워 보여서 lighttpd를 깔았습니다. 나쁘진 않은데 아파치에 들어 있어서 당연히 될 줄 알았던 기능 중 몇몇이 안 되는 걸 발견했는데, 예를 들어 아파치의 mod_negotiation에 대응되는 기능이 없습니다.
mod_negotiation은 흔히 말하는 multi view를 지원해 주는 모듈입니다. 이를테면 어떤 디렉토리에 foo.html, foo.txt 같은 게 있으면, "foo"라는 이름으로 접근했을 때 HTTP 요청에 따라 (정확히는 Accept 헤더에 따라) 둘 중 하나를 적절하게 보내 주는 건데, 이게 Content-Type 뿐만 아니라 언어(foo.ko.html, foo.en.html 등으로 지정), 인코딩(foo.html.gz 따위) 등에도 적용되기 때문에 별도의 스크립트 따위 만들지 않고도 정적인 파일만으로 처리를 가능하게 해 주는 겁니다. 저 같은 경우에는 다국어 지원에 많이 썼고, ".php" 같은 확장자 없는 URL을 만들 때도 종종 썼습니다.
에... 그래서 다 좋은데 lighttpd에는 대응되는 모듈이 없습니다. mod_rewrite를 응용하면 좋겠지만 lighttpd의 해당하는 모듈은 단순한 치환만 가능하기 때문에 별 소용이 없습니다. 대신 mod_magnet이라는 모듈로 루아 스크립트를 가지고 복잡한 치환을 가능하게 하는 건 가능한데, 누가 이걸 갖고 비슷한 일을 하는 스크립트를 만들었습니다. 하지만 제가 원하는 것과는 한참 동떨어졌기 때문에 적절히 고쳐서; 배포하게 되었습니다. (원래 스크립트는 언어에 대한 지원이 없습니다.)
사용법
lighttpd 설정에 다음과 같은 내용을 추가하거나 비슷한 일을 하는 걸 넣습니다.
# mod_magnet이 없다면 넣을 것 server.modules += ("mod_magnet") # 조건절과 파일 경로는 알아서 고칠 것 $HTTP["host"] =~ "^(.*)(domain\.com)$" { magnet.attract-physical-path-to = ("path/to/multiview.lua") }
multiview.lua는 첨부된 파일을 쓰면 됩니다. (pastie에도 올라와 있습니다.) 스크립트는 그다지 완전한 것은 아니고 Accept-Language만 부분적으로 사용하며 Accept는 무시하고 있습니다. EXTENSIONS과 LANGUAGES는 별도의 언어 설정이 없을 때 사용되는 확장자들로 필요에 따라 적절히 고치시면 됩니다.
multiview.lua는 저작권을 포기(public domain dedication)하므로 필요하신 분은 적절히 알아서 잘 갖다/고쳐 쓰시면 감사하겠습니다.
첨부 | 파일 크기 |
---|---|
![]() | 3.99 KB |
댓글 달기