IT_Server/Web_Server & WAS

[펌] 아파치 튜토리얼: .htaccess 파일 / .htaccess로 특정 페이지만 SSL 대응하기 등등

JJun ™ 2017. 5. 26. 06:46



 * 출처

 : https://httpd.apache.org/docs/2.2/ko/howto/htaccess.html

 : https://nanati.me/htaccess_page_ssl/

 : https://nanati.me/htaccess-http-https-ssl/

 : https://avada.tistory.com/1010

 : http://blog.naver.com/jesstter/221028988813





아파치 튜토리얼: .htaccess 파일

가능한 언어:  en  |  fr  |  ja  |  ko  |  pt-br 

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

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

top
top

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

.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"가 있는지 확인한다.

top

언제 .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

top

어떻게 지시어를 적용하나

.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 실행을 허용하지 않는다.

top

인증 예제

인증 방법을 알기위해 바로 이곳부터 읽는다면 주의할 것이 있다. 암호 인증을 하려면 .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 지시어가 필요함을 명심하라.

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

top

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 투토리얼을 보길 바란다.

top

CGI 예제

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

Options +ExecCGI
AddHandler cgi-script cgi pl

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

Options +ExecCGI
SetHandler cgi-script

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

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

top

문제해결

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

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

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

가능한 언어:  en  |  fr  |  ja  |  ko  |  pt-br 

top

Comments

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our mailing lists.





.htaccess로 특정 페이지만 SSL대응하기


특정 페이지만 SSL 대응할 경우, 원래대로라면 SSL 페이지 내 링크를 일일히 변경하는 등의 귀찮은 작업을 해야만 하겠지만, 그렇게 할 수만은 없는 상황이 있다. 그럴 때 .htaccess의 mod_rewrite만으로 어떻게 안될까?


먼저 SSL로 처리하고 싶은 페이지의 디렉터리에 .htaccess를 작성. 

아래의 예의 경우 contact.php, contact_2.php, contact_3.php만을 SSL대상으로 지정할 수 있다.

.php에 접속할 경우 자동적으로 https로 리다이렉트되기 때문에 링크의 URL을 수정할 필요가 없게 된다.
단지 이것만으로는 SSL페이지에서 다른 페이지로의 링크를 클릭했을 때, https인 채로 넘어가기 때문에 

루트 디렉터리에 .htaccess를 작성해서 이 점을 방지하기 위한 내용을 추가해야 한다.

https에 접속했을 경우에 강제적으로 http로 리다이렉트 시켜줄 수 있게 된다.

한가지 더 설정이 필요한데, 이러한 내용을 통해 SSL설정된 페이지에 접속해 보면, 이미지 파일이 표시가 안되는 경우가 있다. 일반적으로 이미지만 따로 image라는 폴더에 모아 놓는 경우가 많은데, 이미지에 접속하려고 할 때 루트 디렉터리에 설치된 .htaccess 때문에, https가 http로 강제적으로 변경되어버리기 때문이다. 

이미지가 저장된 디렉터리에도 아래의 .htaccess를 작성해 준다.

위 한줄로 이미지 파일에 접속했을 때는 mod_rewrite를 무효로 처리한다. 

이렇게 하면 https로 접속된 경우 SSL로 이미지를 불러들이고, http로 접속하면 http(원래대로)로 불러들인다.

그 밖에, js, css파일 등의 디렉터리도 마찬가지로 mod_rewrite를 무효화 시켜주는 작업이 필요하다.

이 디렉터리 저 디렉터리에 너무 많이 .htaccess를 작성하는 것도 문제지만, 

SSL페이지의 링크URL을 전부 https로 수정하는 것, 어느 쪽이 작업이 수월한지 상황에 맞춰 판단하면 되겠다.





htaccess / 문의페이지만 https처리하기(SSL)


새로운 작업을 할 때마다 .htaccess를 써넣어줘야 하는데, 매번 같은 작업을 검색해서 사용하는 바람에, 
쓸데없는 시간이 걸려버린다.
그래서 개인적인 기록용으로!!
이번 내용은 폼이 들어간 문의페이지만을 SSL화 하기 위한 내용인데, mod_rewrite를 써서 HTTP와 HTTPS를 자유롭게 왔다 갔다 할 수 있도록 한다. 이 내용 저 내용으로 시행착오를 거쳐 최종적으로 선택된 녀석을 기록해두겠음.
혹시 사용하실 분들이 계시면 그냥 복사해서 자기 환경에 맞게 쓰시면 되겠다.
mod_rewrite은 Apache의 기능이므로 다른 환경에서는 이용 불가능.
RewriteEngine을 사용할 때는 먼저, RewriteEngine on를 첫 줄에 써준 후 RewriteRule을 써내려 감.

.htaccess 기입방법

  • %{HTTP_HOST}로 호스트를 한정시키는 건、개발환경에서 무효화시키기 위해서.
  • css나 이미지 파일을 리다이렉트 시키면 https on의 페이지에서 암호화되지 않은 콘텐츠를 읽어들여
    에러가 생기므로 예외를 써줌.

RewriteRule의 [R,L]은 무엇을 나타내는가

  • [L]은 정의의 마지막 줄(Last)을 의미함. 이 줄 아래의 RewriteRule은 모두 무시. 가장 마지막 행에 씀.
  • [L]을 쓰지 않아도 동작은 함.
  • [R]은 리다이렉트 실행함.





htaccess 파일에서 특정 페이지(URL)를 제외하고 HTTPS로 리디렉션시키기


SSL 인증서를 설치하고 다음과 같은 코드를 .htaccess 파일에 추가하면 모든 http 트래픽이 https로 리디렉됩니다.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

하지만 경우에 따라 SSL 인증서를 설치한 상황에서 특정 페이지만 http로 연결되도록 해야 하는 경우가 있을 수 있습니다.

예를 들어, 개인정보를 취급하는 페이지에는 모두 SSL 보안서버 인증서를 설치하여야 하지만 네이버 쇼핑과 네이버 페이를 사용하려면 https가 아닌 일반 http로 접속이 되어야 한다고 합니다.

이 경우 다음 stackoverflow 글을 참고해볼 수 있습니다.

다음과 같은 코드를 htaccess에 추가하면 특정 URL을 제외한 모든 URL이 https로 리디렉션될 것입니다.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{THE_REQUEST} !/npay_product_info/ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
 
# force http:// for selected URLs
RewriteCond %{HTTPS} on
RewriteCond %{THE_REQUEST} /npay_product_info/ [NC]
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

혹은 다음과 같은 코드를 시도해볼 수 있습니다.

RewriteEngine on
# Go to https if not on room.html
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} !^/room.html$ [NC]
RewriteRule ^(.*)$ https://www.mycookiedomain.com/$1 [R,L]

# Go to http if you are on room.html
RewriteCond %{SERVER_PORT} !80
RewriteCond %{REQUEST_URI} ^/room.html$ [NC]
RewriteRule ^(.*)$ http://www.mycookiedomain.com/$1 [R,L]
// 출처: stackexchange

위의 코드를 적용하면 아마 제대로 작동할 것입니다. 어떤 글에서는 다음과 비슷한 코드를 제시하기도 하네요.

RewriteEngine on
# Go to https if not on /your-page-url/
RewriteCond %{SERVER_PORT} =80
RewriteCond %{THE_REQUEST} !/your-page-url/ [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
 
# Go to http if on /your-page-url/
RewriteCond %{SERVER_PORT} !=80
RewriteCond %{THE_REQUEST} /your-page-url/ [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

기본적으로 위에 제시된 코드와 동일한 것 같습니다.

만약 위의 코드를 넣어도 제대로 작동하지 않으면 HTTPS로 강제로 리다이렉트되도록 하는 플러그인이나 기능이 있으면 해제하면 제대로 작동할 것입니다. 

이하 생략...








아파치 .htaccess로 특정페이지 ssl 통신 설정


1. 루트디렉토리에서 모든페이지를 80번으로 통신하도록  .htaccess 파일 생성



  RewriteEngine on
  RewriteCond %{SERVER_PORT} ^443$
  RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]




2. 특정디렉토리로 들어가서  필요한 페이지만 ssl 통신 하도록 .htaccess 파일 생성

(그외 페이지는 http 통신)



  RewriteEngine on
  RewriteCond %{REQUEST_URI} .*/login.php$ [OR]
  RewriteCond %{REQUEST_URI} .*/login_session.php$
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
 
  RewriteCond %{REQUEST_URI} !(.*/login.php$)
  RewriteCond %{REQUEST_URI} !(.*/login_session.php$)
  RewriteCond %{HTTPS} on
  RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R,L] 



 

3. ssl 로 통신시  이미지가 잘 표시되는 않는 경우 image 폴더에 .htaccess 파일 생성



  RewriteEngine off




4. [참고] 모든사이트의 통신을 https로 하도록 설정



  RewriteEngine on
  RewriteCond %{SERVER_PORT} ^80$
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]