아파치 mod_rewrite 규칙 가져오기

등록일시: 2008-07-30 13:26,  수정일시: 2013-11-18 14:58
조회수: 8,111
이 문서는 IIS 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

IIS 7.0 URL 재작성 모듈은 아파치의 mod_rewrite 규칙을 손쉽게 IIS의 URL 재작성 규칙으로 변환할 수 있는 규칙 가져오기 기능을 제공해줍니다. 본문에서는 URL 재작성 모듈이 제공해주는 "Import Rules" 기능을 사용해서 일련의 mod_rewrite 규칙들을 IIS 구성 설정 파일로 가져오는 방법을 살펴봅니다. *

* 저는 기술적으로 아파치에 관해서 거의 아무 것도 모릅니다. 따라서, 본문의 번역 중 아파치 관련 부분에서 오역이나 의도하지 않는 잘못된 정보가 존재할 수 있음을 미리 감안하시기 바랍니다.

미리보기 시나리오 구성

먼저, mod_rewrite로부터 변환된 규칙이 정상적으로 동작하는지 여부를 테스트해보기 위한 용도로 사용될, 강제로 웹 사이트의 공식 호스트 이름을(Canonical Hostname) 사용하게 만드는 일반적인 시나리오를 구현해 보겠습니다. 예를 들어서, mysite.com 같은 호스트 이름 대신 www.mysite.com 같은 형태의 호스트 이름을 강제로 사용하도록 만들고, 그 밖에 다른 호스트 이름으로 만들어진 요청이 들어오면 이를 공식 호스트 이름을 사용한 요청으로 재작성하려고 합니다. *

이 시나리오를 구성하기 위해서는 다음과 같은 과정을 거칩니다:

  1. IIS 관리자를 실행하고 "Default Web Site"를 클릭해서 선택합니다.
  2. "작업" 패인에서 "Bindings" 링크 버튼을 클릭하고 8088 포트를 사용하는 새로운 바인딩을 추가합니다:
  3. 메모장으로 %SystemDrive%\windows\system32\drivers\etc\hosts 파일을 열고 다음과 같은 두 라인을 파일의 마지막에 추가합니다:
    127.0.0.1 www_mysite_com
    127.0.0.1 mysite_com
    도메인 분리자로 "." 문자 대신 "_" 문자가 사용된다는 점에 주의하시기 바랍니다. 이는 테스트를 위해 웹 브라우저가 DNS 서버를 사용해서 도메인 이름을 해석하는 것을 막기 위한 것입니다.
  4. 웹 브라우저에서 http://www_mysite_com/iisstart.htm과 http://mysite_com/iisstart.htm을 입력해서 호스트 이름이 정상적으로 설정되었는지 점검해봅니다.

* "공식 호스트 이름(Canonical Hostname)"이라는 다소 낯선 용어는 주로 DNS 서버에 관한 문서에서 찾아볼 수 있는 용어입니다. 가령, DNS 서버에서 사용되는 CNAME이라는 단어의 C가 바로 Canonical의 약자입니다. 그러나, 본문에서는 이런 점에 너무 집착할 필요 없이, 단지 "www."를 붇이지 않은 모든 요청된 URL에 강제적으로 "www."를 붙이는 재작성 규칙을 다룬다는 점만 주의하면 본문을 이해하는데 별다른 무리는 없을 것입니다.

mod_rewrite 규칙 변환하기

강제적으로 웹 사이트의 공식 호스트 이름을 사용하도록 하는 아파치의 mod_rewrite 규칙은 다음과 같습니다:

#For sites running on a port other than 80:
RewriteCond %{HTTP_HOST}   !^www_mysite_com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/(.*)         http://www_mysite_com:%{SERVER_PORT}/$1 [L,R]
    
#And for a site running on port 80
RewriteCond %{HTTP_HOST}   !^www_mysite_com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www_mysite_com/$1 [L,R]

이 규칙들을 IIS URL 재작성 형식으로 변환하려면, IIS 관리자를 실행하고 "URL Rewrite Module" 기능 아이콘을 더블 클릭합니다:

그 다음에 "작업" 패인에서 "Import Rules..." 링크 버튼을 클릭합니다:

그리고, mod_rewrite 규칙을 "Rewrite rules" 텍스트 박스에 붙여 넣습니다.

그러면, "Converted rules" 그룹 박스의 "Tree View" 탭에 규칙이 변환된 결과가 나타납니다. 또한, "Xml View" 탭을 살펴보면 Web.config 파일에 저장될 내용들을 미리 살펴볼 수도 있습니다.

다시 "Tree View" 탭으로 돌아와서 트리뷰의 특정 노드를 선택해보면, "Rewrite rules" 텍스트 박스에서 그에 해당하는 mod_rewrite 규칙의 지시자가 반전되는 것을 확인할 수 있습니다.

변환된 규칙들의 이름이 기본값으로 지정되어 있다는 점에 주의하시기 바랍니다. 해당 규칙이 수행하는 작업에 대한 의미있는 정보를 담고 있는 이름으로 규칙 이름을 변경할 수도 있습니다. 규칙 이름을 변경하려면, 트리뷰에서 노드를 마우스 오른쪽 버튼을 클릭하면 나타나는 팝업 메뉴를 선택하십시오:

먼저, 첫 번째 규칙의 이름을 "ImportedRule1"에서 "Redirect to www_mysite_com:non-80"으로 변경합니다. 그리고, 두 번째 규칙의 이름을 "ImportedRule2"에서 "Redirect to www_mysite_com:80"으로 변경합니다.

마지막으로 "Apply" 링크 버튼을 클릭해서 변환된 규칙을 Web.config 파일에 저장하고, "Back to rules" 링크 버튼을 클릭합니다:

변환된 규칙 테스트

변환된 mod_rewrite 규칙들이 올바르게 동작하는지 테스트해보려면 웹 브라우저를 실행하고 다음 URL들을 입력해봅니다:

  • http://localhost/iisstart.htm
  • http://mysite_com/iisstart.htm

두 경우 모두, http://www_mysite_com/iisstart.htm으로 재전송되는 것을 확인할 수 있을 것입니다.

또한, 다음의 URL 들도 테스트를 해보시기 바랍니다:

  • http://localhost:8088/iisstart.htm
  • http://mysite_com:8088/iisstart.htm

그러면, 마찬가지로 http://www_mysite_com:8088/iisstart.htm으로 재전송되는 것을 확인할 수 있습니다.

요약

본문에서는 아파치의 mod_rewrite 규칙을 IIS 구성 설정으로 가져오는 방법과 그 규칙을 URL 재작성 모듈에서 사용하는 방법을 살펴봤습니다. 본문에서 살펴본 mod_rewrite 재작성 규칙은 강제로 웹 사이트의 공식 호스트 이름을 사용하도록 만드는 규칙이었습니다. 보다 많은 아파치 mod_rewrite 규칙의 사례를 살펴보려면 http://search.live.com/results.aspx?q=mod_rewrite+examples를 참고하시기 바랍니다.

참고

기본적으로 URL 재작성 모듈은 아파치의 mod_rewrite 규칙을 기능적으로 동일한 IIS의 재작성 규칙으로 변환하기 위해서 최대한 노력합니다. 그러나, 아파치와 IIS는 근본적인 아키텍처가 다르기 때문에 모든 mod_rewrite 규칙을 적절하게 변환하는 것은 불가능하므로, 변환 작업을 수행하기에 앞서 mod_rewrite 규칙이 수행하는 작업을 이해하기 위해서 충분히 분석할 필요가 있습니다. 그 뒤에 IIS URL 재작성 규칙의 변환을 수행하고 동일한 URL 재작성 로직을 구현하는 IIS 재작성 규칙으로 정확하게 변환되었는지 점검과 테스트를 수행해봐야 합니다.

그리고, 아파치의 mod_rewrite 구문을 준수하는 규칙들만 변환 가능하다는 점에 주의하십시오. 그 밖의 다른 형식으로 작성된 재작성 규칙들(ISAPI_Rewrite, Ionic ISAPI Rewrite, IISRewrite 등)은 인식되지 않거나 올바르게 변환되지 않을 것입니다. *

* 여기에 언급된 다른 URL 재작성 도구들에 관해서는 각각 다음의 URL들을 참고하시기 바랍니다. 무료 버전을 따로 제공하는 제품도 있고 구버전의 IIS에서도 대부분 사용이 가능한 제품들입니다.