Apache HTTP Server Version 2.4

Apache > HTTP Server > Documentation > Version 2.4 > How-To / Tutorials

# 아파치 투토리얼: .htaccess 파일

이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요.

`.htaccess` 파일을 사용하여 디렉토리별로 설정을 변경할 수 있다.

## .htaccess 파일

관련된 모듈 | 관련된 지시어
--- | ---
`core` `mod_authn_file` `mod_authz_groupfile` `mod_cgi` `mod_include` `mod_mime` | `AccessFileName` `AllowOverride` `Options` `AddHandler` `SetHandler` `AuthType` `AuthName` `AuthUserFile` `AuthGroupFile` `Require`

## 무엇이며/어떻게 사용하는가

`.htaccess` 파일(혹은 "분산 설정파일")을 사용하면 디렉토리별로 설정을 변경할 수 있다. 여러 설정 지시어가 있는 파일을 특정 문서 디렉토리에 두면, 그 디렉토리와 모든 하위디렉토리에 지시어를 적용한다.

### 주의:

`.htaccess` 파일명을 다르게 사용하고 싶다면, `AccessFileName` 지시어를 사용하여 변경할 수 있다. 예를 들어, `.config` 파일명을 사용하려면 서버 설정파일에 다음과 같이 추가한다.

`AccessFileName .config`

일반적으로 `.htaccess` 파일은 주설정파일과 문법이 같다. `AllowOverride` 지시어가 이 파일에 나올 수 있는 내용을 결정한다. 이 지시어는 `.htaccess` 파일에서 허용하는 지시어 분류를 지정한다. 지시어를 `.htaccess` 파일에서 사용할 수 있다면, 해당 지시어 문서의 Override 항목은 지시어를 허용하기위해 `AllowOverride`에 사용할 값을 알려준다.

예를 들어, `AddDefaultCharset` 지시어 문서를 보면 이 지시어를 `.htaccess` 파일에서 사용할 수 있다. (지시어 요약에서 사용장소 항목을 보라.) Override 줄에 `FileInfo`가 있다. 그래서 이 지시어를 `.htaccess` 파일에서 사용하기위해서는 최소한 `AllowOverride FileInfo`가 필요하다.

### 예제:

사용장소: | 주서버설정, 가상호스트, directory, .htaccess
Override: | FileInfo

특정 지시어를 `.htaccess` 파일에서 사용할 수 있는지 궁금하면 지시어 문서의 사용장소 항목에 ".htaccess"가 있는지 확인한다.

## 언제 .htaccess 파일을 사용하나 (혹은 사용하지 않나)

일반적으로 주서버파일에 접근할 수 없는 경우가 아니라면 `.htaccess` 파일을 사용하면 안된다. 예를 들어, 사용자 인증이 항상 `.htaccess` 파일에 있어야 한다는 것은 잘못 알려진 오해다. 이는 사실이 아니다. 주서버설정에 사용자 인증 설정을 적을 수 있고, 사실 이러길 권한다.

`.htaccess` 파일은 컨텐츠 제공자가 디렉토리별로 서버 설정을 다르게하고 싶지만 서버 시스템에 root 권한이 없는 경우에 사용한다. 서버 관리자가 설정을 자주 변경하고 싶지 않은 경우 일반 사용자가 직접 `.htaccess` 파일을 수정하도록 허용하는 것이 바람직하다. 예를 들어, 한 컴퓨터에 여러 사용자 사이트를 서비스하는 ISP에서 사용자가 자신의 설정을 변경하고 싶은 경우가 그러하다.

그러나 일반적으로 `.htaccess` 파일은 가급적 피해야 한다. `.htaccess` 파일에서 허용하는 지시어는 주설정파일의 `<Directory>` 섹션과 같은 효과가 있다.

다음 두가지 큰 이유때문에 `.htaccess` 파일 사용을 피해야 한다.

첫번째는 성능이다. `AllowOverride`가 `.htaccess` 파일을 사용하도록 허용하면, 아파치는 디렉토리마다 `.htaccess` 파일을 찾는다. 그래서 `.htaccess` 파일을 허용하면 실제로 파일을 사용하지 않는 경우에도 성능이 떨어진다! 또, `.htaccess` 파일은 문서를 요청할때마다 읽어들인다.

게다가 적용해야 하는 전체 지시어를 모으기위해 아파치는 모든 상위 디렉토리에서 `.htaccess` 파일을 찾는다. (어떻게 지시어를 적용하나 절을 참고.) 그래서 `/www/htdocs/example` 디렉토리에 있는 파일을 요청하면, 아파치는 다음 파일들을 찾아야 한다.

`/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess`

그래서 그 디렉토리에 있는 파일을 접근할 때마다 설정파일이 전혀 없어도 파일시스템을 4번 더 접근해야 한다. (`/`에서도 `.htaccess` 파일을 허용한 경우를 말한다. 보통은 허용하지 않는다.)

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

지시어를 `/www/htdocs/example` 디렉토리의 `.htaccess` 파일을 두는 것과 주서버설정의 `<Directory /www/htdocs/example>` Directory 설정에 두는 것은 완전히 같다.

`/www/htdocs/example`에 있는 `.htaccess` 섹션:

### `/www/htdocs/example`에 있는 .htaccess 파일 내용

`AddType text/example .exm`

### `httpd.conf` 파일에 있는 섹션

`<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>`

그러나 파일을 요청할 때마다 설정을 읽지않고 아파치가 시작할때 한번만 설정을 읽기때문에 같은 설정을 서버설정파일에 사용하면 성능이 더 빠르다.

`AllowOverride` 지시어를 `none`으로 설정하면 `.htaccess` 파일을 완전히 사용할 수 없다.

`AllowOverride None`

## 어떻게 지시어를 적용하나

`.htaccess` 파일을 발견한 디렉토리와 그 디렉토리의 모든 하위디렉토리에 `.htaccess` 파일에 있는 설정 지시어를 적용한다. 그래서 상위디렉토리의 `.htaccess` 파일을 주의해야 한다. 발견한 순서로 지시어를 적용한다. 특정 디렉토리에 있는 `.htaccess` 파일은 상위디렉토리에 있는 `.htaccess` 파일의 지시어를 무효로 만들 수 있고, 상위디렉토리에 있는 지시어는 더 상위디렉토리 혹은 주설정파일에 있는 지시어를 무효로 만들 수 있다.

예제:

`/www/htdocs/example1` 디렉토리에 다음과 같은 `.htaccess` 파일이 있다.

`Options +ExecCGI`

(주의: `.htaccess` 파일에 "`Options`" 지시어를 사용하려면 "`AllowOverride Options`"가 필요하다.)

`/www/htdocs/example1/example2` 디렉토리에는 다음과 같은 `.htaccess` 파일이 있다.

`Options Includes`

이 두번째 `.htaccess` 파일의 `Options Includes`가 이전 설정을 완전히 무효로 만들기때문에 `/www/htdocs/example1/example2` 디렉토리는 CGI 실행을 허용하지 않는다.

## 인증 예제

인증 방법을 알기위해 바로 이곳부터 읽는다면 주의할 것이 있다. 암호 인증을 하려면 `.htaccess` 파일이 필요하다는 오해가 널리 퍼져있다. 이는 사실이 아니다. 주설정파일의 `<Directory>` 섹션에 인증 지시어를 두는 것이 더 권장하는 방법이고, 서버의 주설정파일을 수정할 수 없는 경우에만 `.htaccess` 파일을 사용해야 한다. 언제 `.htaccess` 파일을 사용해야 하는지와 사용하지 말아야 하는지는 위에서 설명하였다.

앞에서 말했지만 아직도 `.htaccess` 파일이 필요하다고 생각되면 아래 설정이 도움이 될 것이다.

`.htaccess` 파일 내용.

`AuthType Basic
AuthName "Password Required"
AuthUserFile /www/passwords/password.file
AuthGroupFile /www/passwords/group.file
Require Group admins`

이 지시어가 동작하기위해서는 `AllowOverride AuthConfig` 지시어가 필요함을 명심하라.

인증과 권한부여에 대한 자세한 설명은 인증 투토리얼을 보길 바란다.

## Server Side Includes 예제

또다른 일반적인 `.htaccess` 파일의 용도는 특정 디렉토리에서 Server Side Includes를 가능하게 만드는 것이다. 원하는 디렉토리의 `.htaccess` 파일에 다음과 같은 설정 지시어를 사용하면 된다.

`Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml`

이 지시어가 동작하려면 `AllowOverride Options`와 `AllowOverride FileInfo`가 모두 필요함을 명심하라.

server-side includes에 대한 자세한 설명은 SSI 투토리얼을 보길 바란다.

## CGI 예제

마지막으로 `.htaccess` 파일을 사용하여 특정 디렉토리에서 CGI 프로그램 실행을 허용하고 싶다면, 다음과 같은 설정을 사용한다.

`Options +ExecCGI
AddHandler cgi-script cgi pl`

혹은 이 디렉토리에 있는 모든 파일을 CGI 프로그램으로 처리하고 싶다면 다음과 같은 설정도 가능하다.

`Options +ExecCGI
SetHandler cgi-script`

이 지시어가 동작하려면 `AllowOverride Options`와 `AllowOverride FileInfo`가 모두 필요함을 명심하라.

CGI 프로그래밍과 설정에 대한 자세한 설명은 CGI 투토리얼을 보길 바란다.

## 문제해결

`.htaccess` 파일에 둔 설정 지시어가 원하는 기능을 하지 않는 경우 여러가지 이유가 있을 수 있다.

가장 일반적인 문제는 설정 지시어를 가능하게 만드는 `AllowOverride`를 설정하지 않은 경우다. 문제가 되는 파일 영역에 `AllowOverride None`이 없는지 확인한다. `.htaccess` 파일을 아무렇게나 적은 다음 페이지를 다시 접근하여 쉽게 검사해볼 수 있다. 서버 오류가 나오지 않으면 거의 확실히 `AllowOverride None`을 사용한 경우다.

반대로 문서에 접근할때 서버 오류가 발생하면 아파치 오류로그를 살펴봐라. 아마도 `.htaccess` 파일에 있는 지시어를 허용하지 않는다고 할 것이다. 아니고 문법 오류가 있다면 오류를 고친다.