.NET 환경에서 개인화 주소 구현

 

1.개요

 

닷넷 환경에서 개인화 주소를 어떻게 개발하고 어떤 이점들이 있는지 알아보겠습니다.

블로그나 기타 사이트들을 보면 개인화 주소를 사용하는 것을 볼 수 있습니다.

http://www.domain.com/blogid/postno형태의 구조를 가지는 개인화 주소도 있고,

http://www.blogid.com/postno형태의 구조를 가지는 개인화 주소도 있습니다.

이리저리 알아본 결과 이런 형태의 개인화 주소를 fancy url 이라고 합니다.

자바에서 주로 쓰이는 용어인 듯한데 용어의 의미가 닷넷이나 자바에 구애받지 않아 fancy url 이라는 용어로 사용할 것입니다.

이 문서는 fancy url의 의미를 알아보고 fancy url을 사용하는 이유와 어떻게 fancy url을 구현하는지에 대해서 알아보겠습니다.

 

2. Fancy Url

 

2.1. 의미

 

URL 주소를 표시할 때 특수 문자나 복잡한 문자열을 사용하지 않고 단순히 영문자와 숫자

그리고 / 문자로 구분하여 이를 짧게 표기하는 방식을 말합니다.

확장자나 GET 방식의 쿼리 스트링에 대한 표시를 단순화 하는 URL 표기법입니다.

 

2.2. 이점

 

l  URL의 단순 명료함

유저가 GET 방식의 복잡한 쿼리 스트링을 외워서 원하는 컨텐츠에 접근하기란 불가능에 가깝다고 볼 수 있습니다.

 

l  검색 엔진에서의 우선순위

대부분의 검색 엔진은 복잡한 쿼리스트링이 표시된 웹 페이지보다 fancy url 의 우선순위가 높다고 합니다.

, 같은 컨텐츠의 내용이라도 쿼리 스트링을 포함한 url보다 fancy url이 더 상위에 노출됩니다.

 

3. Fancy Url 구현

 

3.1. 원리

 

예를 들어 http://www.domain.com/blogid 라는 개인화된 주소가 있을 때 이 페이지의 실제 URL주소는 http://www.domain.com/blog/view.aspx?bid=blogid 입니다.

Front 단에서 fancy url 형태인지를 판별하여 fancy url이라면 blogid 값을 얻어

http://www.domain.com/blog/view.aspx?bid=blogid형태로 보여주게 됩니다.

주소창의 주소유지를 위해 frameset 이나 iframe 등으로 처리하여 웹 페이지에 보여주게 됩니다.

 

3.2. 구현

 

3.2.1. IIS 설정

 

fancy url은 확장자 없는 주소이기 때문에 IIS로 요청이 발생할 때 404 에러를 발생시킵니다.

그렇다고 모든 확장자에 대한 확장자 매핑을 해주게 된다면 isapi 필터를 통해 이미지 파일들이나 js, css, html 등등 서버에서 다 처리를 해줘야 하므로 서버에 부하가 많아지게 됩니다.

서버의 성능이나 여러 상황들을 가정했을 때 웹 서버에서 들어온 요청이 404 에러일 경우 Fancy Url인지 아닌지를 체크하는 방식이 제일 깔끔한 것 같아 이런 방식으로 개발했습니다.

IIS에서 404에러일 경우 특정 페이지(aspx)로 리디렉션 시켜주면 서버에서 처리를 하게 됩니다.

web.config에서 설정할 수도 있지만 보통 로컬에서 테스트할 때 CustomError 속성을 RemoteOnly로 하기 때문에

에러 페이지가 발생하여 디버깅 환경이 힘듭니다.

 

IIS 실행 ?적용할 사이트의 속성 클릭 ? 사용자 지정 오류 탭 ? 404 수정 ? NullPage.aspx ? 적용

실제로 NullPage.aspx 페이지는 서버에 존재하지 않는 페이지입니다.

필자가 개발중엔 사이트의 Fancy Url Global.asax에서 처리하기 때문에 NullPage.aspx 페이지로 리디렉션해도

어차피 isapi 필터를 통해 웹서버에 요청하게 되고 Global.asax를 수행하게 됩니다.

Global에서 처리하지 않고 실제로 NullPage.aspx 페이지를 생성하여 처리해도 무방합니다.

사이트의 성격이 fancy url의 접근도가 낮다면 NullPage.aspx에서 구현하는 것이 바람직하지만,

개발중인 사이트는 접근도가 많기 때문에 Global에서 체크하여 처리하도록 하였습니다.

자신의 사이트의 성격에 맞게 개발하시면 될 듯 합니다.

 

3.2.2. Global.asax

 

실질적으로 Fancy Url 을 담당하는 놈이 Global.asax Application_BeginRequest 이벤트입니다.

개발중인 사이트의 Fancy Url 구조는 http://www.domain.com/blogid/postno 이기 때문에

“/” 문자 배열로 받아 저장하여 요청 들어온 Url을 분석합니다.

만일 “/” 문자열이 없다면 이는 Fancy Url 이 아닌 일반 쿼리스트링을 포함한 Url이 될 것이고

하나라면 www.domain.com/blogid 형태의 Fancy Url이 될 것입니다.

두개라면 www.domain.com/blogid/postno 형태겠죠..

 

설명만으로는 힘든 부분이 많아 소스를 발췌하여 설명드리겠습니다.

 

 

ArrayList pathList = new ArrayList();

string path = Request.RawUrl;

string[] arrayPath = path.Split('/');

for (int i = arrayPath.Length - 1; i >= 0; i--)

{

             if (arrayPath[i] != string.Empty && arrayPath[i] != "ePlayon.Batoo.WEB")

             {

                           if (arrayPath[i].IndexOf(".") == -1 && arrayPath[i] != "jsdebug")

                           {

                                        pathList.Add(arrayPath[i]);

                           }

                           else

                           {

                                        break;

                           }

             }

}

 

위 소스는 현재 요청 URL 을 분석하여 pathList 라는 배열리스트에 FancyUrl 구조를 담습니다.

앞서 말했듯이 pathList의 카운트가 0이라면 일반 URL이고 1이면 블로그, 2라면 포스트 요청을 수행하게 됩니다.

 

 

if (pathList.Count == 1)

{//FancyUrl

             LockerRoomManager manager = new LockerRoomManager();

             string lno = manager.GetLockerRoomGuidByUrl(pathList[0].ToString());

 

             if (lno != string.Empty)

             {

                           StringBuilder retHtml = new StringBuilder();

                           retHtml.Append("<html xmlns='http://www.w3.org/1999/xhtml' >\n");

                           retHtml.Append("\t<head>\n");

                           retHtml.Append("\t\t<title>" + pathList[0].ToString() + " ?쎌빱?/title>\n");

                           retHtml.Append("\t\t<frameset rows='0,*' border=0>\n");

                           retHtml.Append("\t\t\t<frame src='#' name=main>\n");

                           retHtml.Append("\t\t\t<frame src='../LockerRoom/PostList.aspx?lno=" + lno + "'>\n");

                           retHtml.Append("\t\t</frameset>\n");

                           retHtml.Append("\t</head>\n");

                           retHtml.Append("\t<noframes>\n");

                           retHtml.Append("\t\t<body>\n");

                           retHtml.Append("\t\t\t<div></div>\n");

                           retHtml.Append("\t\t</body>\n");

                           retHtml.Append("\t</noframes>\n");

                           retHtml.Append("</html>\n");

                           Response.Write(retHtml.ToString());

                           Response.End();

             }

             else

             {

                           if (path.IndexOf(".asmx") == -1)

                           {

                                        Response.Redirect("~/Error/404.html");

                           }

             }

}

 

위 소스는 블로그 Fancy Url일 경우 처리하는 로직입니다.

블로그 아이디를 얻어와서 DB에 해당 블로그의 아이디가 있는지 검사합니다.

있다면 StringBuilder 객체로 html 코드를 생성하여 뿌려줍니다.

Frameset을 이용했는데 이를 이용함으로써 주소창의 주소가 계속 유지할 수 있습니다.

만일 블로그 아이디가 없다면 404에러 페이지로 리디렉션 시킵니다.

 

포스트 Fancy Url도 블로그 Fancy Url과 형태가 같습니다.

이렇게 함으로써 정상적으로 Fancy Url의 처리를 완료 할 수 있습니다.

 

4. 마무리

Fancy Url을 개발하면서 많은 삽질을 해야 했습니다.

처음에 쉽게 구현이 될 줄 알았는데 처음 생각과 달리 HttpHandler HttpModule을 사용하여 개발하려고도 해봤고 실제 이렇게 개발하고 나니 프로젝트 관리에 문제가 있어 처음대로 Global로 선회하였습니다.

 

 

--------------------------------------------

written by 허둥사마

http://tit99hds.egloos.com/

-------------------------------------------- 

+ Recent posts