레이블이 Apache인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Apache인 게시물을 표시합니다. 모든 게시물 표시

수요일, 3월 28, 2012

HTTP Status 상태 코드별로 페이지 작성하기



출처:http://linux.tini4u.net/stories.php

일반적으로 웹호스팅을 받아보면 HTTP Status code page가
윈도우의 기본적인 그것이 아니라 깔끔하게 제작된 페이지를 본적이 있을 것입니다.
그것은 아파치에서(혹은 사용자가 [Override enabled]) 서버에러에 대한
응답을 지정해주어서 그렇습니다.

아파치 문서에 보면 ErrorDocument 부분이 정의되어 있으니
한번쯤 읽어보시면 이해하시기가 쉬우실 겁니다.
대략적으로 정리하면 총 3가지 방법으로 응답을 지정할 수가 있는데,
그것은 아래와 같습니다.


1. 보통의 텍스트
ErrorDocument 500 "The server made a boo boo."


문자열인 경우엔 " " 안에 문자열을 넣으면 됩니다.
추가=> [" "] 표시는 텍스트임을 알려주는 것으로서 그 자체는 출력되지 않습니다.


2. 내부 전환
ErrorDocument 404 /missing.html


서버 내부의 파일로 전환하는 방법인데 주의할 점으로는
절대 경로로 지정했을 경우엔 틀린 방법이라는 것입니다.
문법의 최상위 경로(/)는 DocumentRoot를 의미하기 때문입니다.
즉, 내 도메인이 /home/foobar/www/로 DocumentRoot가 설정되어 있고
전환할 페이지가 /home/foobar/www/missing.html 에 있다면
ErrorDocument 404 /missing.html


위와같이 설정을 해주셔야 작동을 합니다.

다만 이것이 사용자단이 아닌 아파치단에서(httpd.conf) 설정되었을 경우
모든 도메인에 대해서 404 코드는 /missing.html 파일을 찾게 됩니다.
이런 경우 사용자 입장에서는 /missing.html 파일을 사용하지 못합니다.

만약 서버 관리자로써 모든 Status Code 페이지를 전환하려면
Alias /Error "/usr/local/apache/htdocs/Error/"
ErrorDocument 404 /Error/missing.html


이런식으로 Alias를 만들어 주면 해결이 됩니다.
왜냐하면 모든 도메인은 /Error/missing.html를 찾을 것이고
/Error은 /usr/local/apache/htdocs/Error/ 으로 보내지기 때문입니다.
/Error/missing.html를 풀이해보면
/usr/local/apache/htdocs/Error/missing.html 이 되겠죠.

추가=> 스크립트나 SSI로도 내부 전환이 가능합니다.


3. 외부 전환
ErrorDocument 402 http://www.example.com/subscription_info.html


서버 외부의 파일로 전환하는 방법인데 김정균님 경험상으로
외부 전환시 CGI와 htaccess 인증시에 505 Status Code가 발생했다고 합니다.
원래 요청과 관련있는 환경 변수의 상당수가 스크립트에 전달되지 못한다는 점을 알고 있어야 합니다.


※ 설정하면서 주의해야 할 사항
위의 설정대로 설정했고 아무런 문제도 없는데
IE 자체의 에러페이지가 보이는 경우가 있습니다.
이런 경우는 대략 몇가지 문제가 있는데 대표적인것은 아래와 같습니다.

1. 완전한 HTML 페이지가 아닐 경우
<BODY>로 시작해서 </BODY>로 확실하게 끝나지 않았거나
혹은 <HTML>로 시작해서 </HTML>로 확실하게 끝나지 않았을 경우 입니다.
또는 PHP의 exit 명령으로 종료할때 </BODY></HTML>가 출력되지 않는
경우에도 IE 기본 페이지가 나옵니다.

2. Custom error page의 사이즈가 기준치보다 작은 경우
Custom error page 라는게 크기가 정해져 있기 때문에
이 크기가 넘지 않는 경우에도 IE 기본 페이지가 나옵니다.
Custom error page 의 각 크기 기준치는 아래와 같습니다.
Code Description File Size


400 Bad Request > 512 bytes
403 Forbidden > 256 bytes
404 Not Found > 512 bytes
405 Method Not Allowed > 256 bytes
406 Not Acceptable > 512 bytes
408 Request Time-out > 512 bytes
409 Conflict > 512 bytes
410 Gone > 256 bytes
500 Internal Server Error > 512 bytes
501 Not Implemented > 512 bytes
505 HTTP Version Not Supported > 512 bytes

목요일, 3월 22, 2012

Apache Error Code




100 : Continue

101 : Switching protocols

200 : OK, 에러없이 전송 성공

201 : Created, POST 명령 실행 및 성공

202 : Accepted, 서버가 클라이언트 명령을 받음

203 : Non-authoritative information, 서버가 클라이언트 요구 중 일부만 전송

204 : No content, 클라언트 요구을 처리했으나 전송할 데이터가 없음

205 : Reset content

206 : Partial content

300 : Multiple choices, 최근에 옮겨진 데이터를 요청

301 : Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음

302 : Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시

303 : See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음

304 : Not modified

305 : Use proxy

400 : Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음

401 : Unauthorized, 클라이언트의 인증 실패

402 : Payment required, 예약됨

403 : Forbidden, 접근이 거부된 문서를 요청함

404 : Not found, 문서를 찾을 수 없음

405 : Method not allowed, 리소스를 허용안함

406 : Not acceptable, 허용할 수 없음

407 : Proxy authentication required, 프록시 인증 필요

408 : Request timeout, 요청시간이 지남

409 : Conflict

410 : Gone, 영구적으로 사용할 수 없음

411 : Length required

412 : Precondition failed, 전체조건 실패

413 : Request entity too large,

414 : Request-URI too long, URL이 너무 김

415 : Unsupported media type

500 : Internal server error, 내부서버 오류(잘못된 스크립트 실행시)

501 : Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을 요구함

502 : Bad gateway, 서버의 과부하 상태

503 : Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태

504 : Gateway timeout

505 : HTTP version not supported

수요일, 3월 21, 2012

Apache에서 특정 디렉토리 및 파일에 접근 제한 걸기


서버를 운영하다보면 특정 디렉토리나 파일에 대해서는 인증된 유저나 특정 대역의 IP에 대해서만 접근하게 할 필요가 생기게 된다.

디렉토리에 대해서 접근을 제어하고자 할때에는
1. .htaccess
2. httpd.conf의 <Directory>
를 사용할 수 있으며
파일에 대해서 접근을 제어하고자 할때에는
1. .htaccess
2. httpd.conf의 <Location> 또는 <Files>
을 사용하면 된다.

다음은 접근관련에 사용되는 예제이다. <Directory> 설정만 직접 사용하고 있을뿐
다른 제어방법은 보장은 못하지만 잘될것이라고 본다. ^^;;
보다 자세한 방법은 아파치 How-to를 참고하시길...

1. .htaccess 방법
htpasswd를 사용하여 .htaccess또는 임의의 파일에 접근을 허락할 사용자(id,pw)를 생성한다. (인증관련된 보다 자세한 정보는 여기)

AuthName "접근제한 디렉토리 또는 파일입니다."
AuthType Basic
AuthUserFile /htpasswd/파일있는/경로/.htpasswd
Require valid-user

2. Directory/Location/Files 방법
현재 예제에서는 IP로 접근을 제한하였지만 IP대신에 .htpassed관련 내용을 삽입하면 htpasswd를 사용하여 접근을 제어 할 수 있다.

<Directory "/접근제한을/설정하고자하는/디렉토리/이름">
    AllowOverride AuthConfig
    Order deny,allow
    Deny from all
    Allow from 192.168.0.1
</Directory>


<Location "/접근제한을/설정하고자하는/디렉토리/이름">
   AllowOverride AuthConfig
   Order deny,allow
   Deny from all
   Allow from 192.168.0.1
</Location>


<Files "접근제한을 설정하고자하는 파일이름">
   Order deny,allow
   Deny from all
   Allow from 192.168.0.1
</Files>
Files를 사용하는 경우 아무런 제한없이 "접근제한을 설정하고자하는 파일이름"으로 했을 경우 디렉토리와 상관없없이 모든 동일한 이름을 가지는 파일의 접근을 제한하게 된다. <Directory>와 함께 사용하면 특정 위치의 파일에 대해서만 접근을 제어하게 된다.


htpasswd 사용 예
.htpasswd를 처음 생성하는 경우
htpasswd –c /저장할/디렉토리/경로/.htpasswd username
.htpasswd에다가 사용자를 추가하는 경우
htpasswd /저장할/디렉토리/경로/.htpasswd username

.htpasswd로 예를 들었지만 사용자 임의로 파일이름을 생성하여도 무관하다.