.htaccess란
htaccess는 'hypertext acess'의 약자로 디렉토리에 대한 설정 옵션을 제공한다.
Apache 웹 서버에서 apache2.conf 또는 sites-enabled 파일을 확인해보면 다음과 같이 <Directory> 태그를 통해 파일이 위치한 경로와 디렉토리에 대한 접근 허용 설정을 할 수 있다.
.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
사용 방법
1. 아파치 홈 디렉토리 내부에 .htaccess 파일을 둔다.
2. /etc/apatche2/apatche2.conf 의 홈 디렉토리 경로에 아래와 같은 코드를 추가한다.
.htaccess 파일이 Override하는 것을 허용하겠다는 뜻
AllowOverride ALL
3. 아래 명령어를 사용해 아파치 서버를 재실행한다.
sudo service apache2 restart
+) 에러 처리
아파치 error 로그 확인 명령어
sudo vi /var/log/apache2/error.log
sudo cat /var/log/apache2/error.log
만약 아파치 error 로그에 'Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configurationa2enmod rewrite'와 같은 error가 적혀있다면, mod_rewrite module이 설치가 되어있지 않아 .htaccess 파일 내부 RewriteEngine On 설정이 안되는 경우이다.
apachectl -D DUMP_MODULES | grep -i rewrite
위의 명령어 입력 시 아무것도 나오지 않는다면, 아래 명령어를 이용해 mod_rewrite를 설치해준다.
sudo a2enmod rewrite
아파치를 재실행한 다음
service apache2 restart
아래 명령어로 다시 확인 해보면, rewrite_module (shared) 라는 문구가 뜨고, 하위 접속 경로로 문제없이 연결된다.
apachectl -D DUMP_MODULES | grep -i rewrite
참고자료 :
'BackEnd > Server' 카테고리의 다른 글
[Ubuntu 18.04.5] PHP에서 Anaconda 환경변수 사용하기 (0) | 2021.03.23 |
---|---|
[PHP] $_FILES 오류 메시지 (0) | 2021.02.16 |
AWS EC2 .pem 파일없이 접속하기 (0) | 2021.02.06 |
[SSL] Letsencrypt SSL 인증서 수동 갱신하기 (0) | 2021.01.19 |
아파치(Apache2) + 톰캣(Tomcat8.5) JkMount로 url 구분하기 (0) | 2020.03.09 |
댓글