.htaccess (hypertext access)

 

어 떤 웹 주소를 입력하였을 때, 그 웹 주소에서 정보를 얻은 후 다른 사이트로 연결되는 것을 보신 적이 있을 겁니다. 이것은 웹 프로그래밍을 사용한 것일 수도 있지만 대부분 아파치의 Rewrite와 같은 모듈을 이용한 것입니다. 이 모듈을 이용하면 조건에 맞게 URL을 변경할 수 있습니다. 여기서는 아파치의 .htaccess 파일의 사용법에 대해서 소개하겠습니다.

.htaccess란?

.htaccess (hypertext access)는 Apache 웹 서버의 디렉토리 레벨을 설정하는 기본 파일입니다. .htaccess는 한 특정 디렉토리에 위치하며, 모든 하위 디렉토리를 포함한 해당 디렉토리에 영향을 미칩니다. 이 파일이 위치한 특정 폴더에 사용자가 정의한 Request 기능을 적용합니다. 파일 이름은 .(dot)으로 시작하기 때문에 유닉스 계열의 운영체제에서는 숨김 파일로 저장됩니다.

.htaccess의 파일명을 다르게 사용하고 싶다면, AccessFileName 지시어를 사용하여 변경할 수있습니다. 예를 들어, .config 파일명을 사용하려면 서버 설정파일(httpd.conf)에 다음과 같이 추가 해야합니다.

AccessFileName .config

AllowOverride 지시어가 이 파일에 나올 수 있는 내용을 결정합니다. 이 지시어는 .htaccess 파일에서 허용하는 지시어 분류를 지정합니다.

.htaccess가 필요한 경우

일반적으로 주서버파일에 접근할 수 있는 경우 .htaccess 파일을 사용하면 안됩니다. 예를 들어 사용자 인증이 항상 .htaccess 파일에 있어야 한다는 것은 잘못 알려는 오해입니다. 이는 사실이 아닙니다. 주서버설정에 사용자 인증을 적을 수 있고, 사실 이 방법을 권장합니다. .htaccess 파일은 컨텐츠 제공자가 디렉토리별로 서버 설정을 다르게하고 싶지만 서버 시스템에 루트 권한이 없는 경우에 사용합니다. 서버 관리자가 설정을 자주 변경하고 싶지 않은 경우 일반 사용자가 직접 .htaccess 파일을 수정하도록 허용하는 것이 바람직합니다. 예를 들어, 한 컴퓨터에 여러 사용자 사이트를 서비스하는 ISP에서 사용자가 자신의 설정을 변경하고 싶은 경우가 있습니다.

그러나 일반적으로 .htaccess 파일을 가급적 피해야 합니다. .htaccess 파일에서 허용하는 지시어는 주설정파일의 <Directory> 섹션과 같은 효과가 있습니다. 다음 두 가지 큰 이유 때문에 .htaccess 파일 사용을 피해야 합니다.

AllowOverride.htaccess 파일을 사용하도록 허용하면, Apache는 디렉토리마다 .htaccess 파일을 찾습니다. 그래서 .htaccess 파일은 문서를 요청할 때마다 읽어들입니다. 게다가 적용해야하는 전체 지시어를 모으기위해 Apache는 모든 상위 디렉토리에서 .htaccess 파일을 찾습니다. 그래서 /www/htdocs/example 디렉토리에 있는 파일을 요청하면 Apache는 다음 파일들을 찾아야 합니다.
/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess
그래서 그 디렉토리에 있는 파일을 접근할 때마다 설정파일이 전혀 없어도 파일 시스템을 4번 더 접근해야 합니다.

사용자에게 서버 설정 변경 권한을 주면 당신이 감당할 수 없는 변화가 일어날 수 있습니다. 사용자에게 이런 권한을 줄 지 곰곰이 생각해 보세요. 또, 사용자가 원하는 것보다 적은 권한을 주면 기술지원요청이 들어옵니다. 사용자에게 가능한 권한 수준을 명확히 알려야합니다. 사용자에게 AllowOverride를 어떻게 설정하였는지 정확히 알리고 관련 문서를 제공하면 앞으로 혼란을 피할 수 있습니다.

.htaccess 사용법

.htaccess에서 가장 많이 사용되는 기능은 Rewrite engine입니다. Rewrite는 사이트의 URL을 순회시켜주는 아주 유용한 기능입니다. 예를 들어, http://localhost/naver로 접속을 했을 때 http://www.naver.com로 접속이 가능하도록 할 수있습니다.

.htaccess에서 Rewrite engine의 모든 기능을 사용하기 위해서는 파일 상단에 “RewriteEngine On“을 위치시켜 주어야 합니다.

RewriteEngine On

..
…….

.htaccess에서 사용 가능한 기본적인 Rewrite 구문은 RewriteRule과 RewriteCond입니다. RewriteRule은 URL을 전환해주는 가장 기본적이고 가장 중요한 구문입니다. RewriteCond는 URL에 입력된 조건을 입력하는 구문입니다.

RewriteRule과 RewriteCond의 기본적인 패턴은 다음과 같습니다.

RewriteRule Pattern Substitution
RewriteCond TestString CondPattern

RewriteCond는 RewriteRule을 위해 존재하기도 하지만 RewriteRule은 RewriteCond를 위해 존재하기도 합니다. 하지만 순서는 거의 대부분 RewriteCond 후에 RewriteRule이 옵니다. 또한 RewriteCond를 생략하고 바로 RewriteRule을 사용하는 것도 가능합니다. 다음 예시를 봅시다.

……
RewriteEngine On
……
RewriteRule Pattern Substitution

RewriteCond TestString CondPattern
RewriteRule Pattern Substitution

RewriteRule Pattern Substitution
……

두 개 이상의 Rule이 있을 경우 위쪽에 위치한 RewriteRule이 처리하여 적용된 결과가 다시 두번째 RewriteRule에 적용이 됩니다.

.htaccess에서의 특수문자

프로그래밍을 하면서 그 프로그램 내부 코드나 명령어로 쓰이고 있어서 쓰지 못하는 문자가 있습니다. 그래서 역슬래시(\)를 사용하여 모든 문자를 사용할 수 있습니다. 주로 점(dot, .)이나 대괄호([]), 괄호( ()) 등에 쓰입니다. 정규표현식 기초

.: 다수의 한문자

?: 0개 이상의 한문자

*: 0개 이상의 문자 또는 문자열

+: 1개 이상의 문자 또는 문자열

(chars): (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.

^: 문자열의 첫문(열)을 지정합니다.

$: 문자열의 끝 문자(열)을 지정합니다.

\(역슬래쉬): 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.(예:(, ), [, ], . 등)

{n}: 정확히 n번 반복

{n,}: n번 이상 반복

{n,m}: n 이상 m 이하 반복

[chars]: 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.

예) [a-z]: a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T

정규표현식 단축표현들

[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현

[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현

[:digit:] : 숫자 [0-9] 와 같은 표현

[:upper:] : 대문자. [A-Z] 와 같은 표현

RewriteCond, RewriteRule

RewriteCond와 RewriteRule의 기본 구문은 이미 위에서 설명하였습니다.
TestString 부분에 $N이나 %N이 쓰인다면 역참조 기능을 제공하게 됩니다. 여기서 N은 1≤N≤9입니다.
RewriteRule에서 $N을 사용하게 되면 하나의 변수처럼 패턴에 일치하는 문자열을 사용할 수 있습니다.
아래와 같이 사용이 가능합니다.

RewriteCond %{HTTP_HOST} ^[^.]+\.domain\.co\.kr$
RewriteRule ^(.*?) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.domain\.co\.kr(.*) /home/$1/htdocs$2

위 예제의 경우 도메인 앞의 URI를 $1, 그 뒤 경로를 $2로 지정하여 특정 디렉토리의 내용을 읽도록 합니다.
위의 것을 짧게 사용하고 싶다면 아래와 같이 가능합니다.

RewriteRule ^([^.]+)\.domain\.co\.kr(.*) /home/$1/htdocs$2

RewriteCond

RewriteCond에서 쓰이는 명령어를 알아보도록 하겠습니다.

-d: 디렉토리를 의미합니다. TestString이 이렉토리를 가리키거나 포함하고 있을 때 처리됩니다.

-f: 파일을 의미합니다. TestString이 파일을 가리키더나 포함하고 있을 때 처리됩니다.

-l: 심볼릭링크를 의미합니다. TestString이 심볼릭링크를 가리키거나 포함하고 있을 때 처리됩니다.

마지막으로 느낌표(!)는 부정을 뜻합니다.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://test.domain.co.kr/$1

위 예제는 Request 내용이 디렉토리나 파일을 가리키고 있지 않을 경우 저쪽 사이트로 접속하게 만들라는 의미입니다. 로 하위주소는 유지하고 있습니다.

Flag

라인마다 Flag라 불리는 기능을 사용할 수 있습니다.

F: 403 Forbidden 에러 페이지를 출력합니다. 접근 권한이 없다는 의미입니다.

L: Last(마지막)를 의미합니다. 이곳에서 Rewrite가 끝납니다.

N: 새로운 Rule이 시작된다는 의미입니다.

QSA: Cond의 내용을 지난 결과에 덧붙입니다.

NE: Out 될 값에 특수문자가 HexCode로 되어 포함되어 있는 경우

R: Redirection. 무조건 넘깁니다. 뒤 주소로 넘긴다는 의미입니다.

NC: 대소문자를 구별하지 않습니다.

OR: 프로그래밍의 or와 비슷합니다.

위의 Flag들을 사용하여 아래와 같은 예제가 탄생했습니다!

RewriteCond %{REMOTE_HOST}  ^domain.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN.*  [OR]
RewriteCond %{REMOTE_HOST}  ^DOMAIN2.* [NC]
RewriteRule ^(.*)$ http://www.domain.co.kr/ [R,L]

domain, domain2, DOMAIN, DOMAIN2로부터 접속한 경우 Redirect합니다. http://www.domain.co.kr로 접속하게 됩니다.

Posted in htaccess