Thursday, July 02, 2009

[펌] 아파치 URL Rewrite Module을 사용한 바로가기 URL 기능 구현

 

출처 붉은늑대 ~ Justfun!! | 붉은늑대
원문 http://blog.naver.com/tinywolf00/100003809738

 

앞에서 RedirectServlet을 이용한 바로가기 URL 기능 구현을 알아보았습니다.

 

RedirectServlet을 만든 목적은 바로가기 URL 기능을 어플리케이션 레벨에서 처리하도록 함으로써 웹서버에 의존적이지 않도록 하기 위함입니다.

 

RedirectServlet을 사용하기 위해서는 웹서버로의 모든 요청이 WAS로 전달되어야 하며, 이는 정적 페이지 및 이미지 등에 대한 요청도 WAS가 모두 처리하게 됨을 의미합니다. 즉, StandAlone과 다름 없지요.

 

알다시피 HTTP에서 이미지 파일에 대한 요청은 모두 한번에 이루어 지는 것이 아니라 이미지 별로 각각의 Connection이 생기게 되고, 이는 그 만큼 Request가 많아짐을 의미하게 됩니다. 따라서 이러한 요청에 대해 모두 WAS가 처리하게 되는 것은 큰 부담을 수 밖에 없습니다.

 

이를 해결하기 위해서 이번엔 아파치 웹서버(이하 아파치)를 예로 들어, 웹서버의 설정을 통해 바로가기 URL을 구현해보도록 하겠습니다. (웹서버에서 제공하는 기능을 사용하는 것이니, 구현이라는 말은 조금 무리가 있겠네요.. )

 

 

아파치는 mod_rewrite.so 모듈을 통해 URL Rewrite 기능을 제공합니다. 이는 말 그대로 URL을 재작성 해주는 것으로, 자바 스크립트의 location.href나 JSP의 response.sendRedirect와 같은 역할을 해줍니다. 즉, Redirect 되는 것이죠. 따라서 브라우저의 URL이 Redirect되는 URL로 변경되게 됩니다.

 

하지만 우리가 원하는 것은 처음 요청한 URL인 http://URL/XXX 를 그대로 유지하면서, 실제로 보여지는 내용은 다른 URL의 처리 내용이 되는, 그런 기능을 원하는 것이죠. 즉, Redirect가 아닌 Forward 기능을 원하는 것입니다.

 

안타깝게도 아파치는 Rewrite를 통한 특정 URL로의 Redirect는 지원하지만, Forward는 지원하지 않습니다. (제가 알기로는... 그렇네요. 혹시나 아파치에서의 Forward 설정 방법을 아시는 분은 연락바랍니다. ^^;;)

 

 

하지만, 언제 어디서나 꽁수는 존재하는 법!!

 

Rewrite 모듈의 기능을 조금 더 알게 되면, 그 방법이 보입니다. Rewrite는 특정 URL로 접근했을 때, 다른 URL로 Redirect할 수도 있지만 특정 파일을 보여주도록 설정할 수도 있습니다. 만약 특정 파일을 지정해줬을 경우에는 아파치에서 해당 파일을 응답 페이지로 보여주게 됩니다. 이때, URL은 전혀 바뀌지 않죠.. 바로 Forwarding입니다!!

 

이를 발전시키면, 특정 패턴의 URL로 접근했을 때 특정 파일로 Forwarding하고, 그 파일에서 실제 보여질 URL을 처리하면 우리가 원하는 바로가기 URL 기능이 되는 것입니다.

 

알아두실 것은 Forwarding할 페이지는 아파치가 처리할 수 있는 페이지여야 한다는 것입니다. 즉, html이여야 한다는 얘기죠. (뭐 다른 페이지들도 있겠습니다만.....)

 

만약 cgi를 사용하지 않고, 그냥 html로만 처리한다고 했을 때 자바스크립트를 통해 Request URI를 얻어와 처리할 수 있습니다.

 

 

 

* 예제는 첨부파일을 참조하세요.

(http://URL/XXXhttp://URL/cafe.do?cid=XXX로 포워딩하는 예제입니다.)

 

 

 

참조

Apache 1.3 URL Rewriting Guide : http://httpd.apache.org/docs/misc/rewriteguide.html

Module mod_rewrite Reference : http://httpd.apache.org/docs/mod/mod_rewrite.html

 

========================================================================================

2004-07-05 조재호(tinywolf@korea.com)

 

No comments: