FAQ for CGI Errors

[500 Server Error (Server Error or Internal Server Error) ]

이 에러는 CGI를 운용할 때, 가장 많이 일어나는 에러 입니다. 가장 광범위한 이유로 일어나는 에러이므로, 가장 처리하기가 까다로우면서, 또 이유를 알고보면 가장 간단한 경우일 수도 있습니다.

이 에러를 수정할 수 있는 방법을 하나 하나 설명해 보겠습니다.

  1. 먼저 계정의 쉘 상태에서 그 CGI프로그램을 실행시켜 봅니다. 즉 방명록의 경우에는 guestbook 디렉토리에서 perl guestbook.cgi 와 같은 형태로 명령을 줍니다.
    만약, 그 스크립트가 문법적인 오류(syntax error)가 있으면 perl interpreter 가 그 문법적인 오류를 지적해 줍니다. 그렇지 않으면 그 스크립트가 원만히 실행되어, 통상적으로 스크립트 에서 코딩된 일련의 형태의 문서가 화면에 나타나거나 아니면 아뭇것도 나타나지 않고 실행이 완료됩니다.
    문법적인 오류가 있으면 그 오류가 생긴 line번호가 같이 표시됩니다. 만약 그 line이 손을 대어 수정한 부분이라면 그 줄을 다시 살펴 보아서 어떤 문법적인 오류가 있는 지 체크해 보십시오.

    만약 문법적인 오류중에 Can't find string terminator "__END_POSTGUEST__" anywhere before EOF at guestbook.cgi line 224 등과 같이 손을 대지 않은 부분인데도, can't find string treminator 에러가 난다면 UNIX의 아스키 파일이 아니기 때문에 일어날 수 있습 니다. (이 에러는 아래 3번을 참조하십시오.)

  2. 위의 상태가 O.K 라면 그 다음에는 각 파일들의 퍼미션을 체크해 볼 필요가 있습니다. (Windows NT 사용자는 물론 필요없습니다.)
    특히 방명록의 경우에는 guestbook.html, 또 업로드(Ver1.1)의 경우에는 index.html 등이 반드시 읽기, 쓰기 권한이 주어진 666 으로 퍼미션이 주어져 있어야 합니다. 또한 대화방 설치시 일어나는 500 에러중에 각 대화방의 디렉토리의 퍼미션이 777로 주어지지 않은 경우도 많이 있었습니다. 게시판 설치시에도 반드시 퍼미션을 확인해 보아야 합니다. 그리고 다른 파일들의 퍼미션도 모두 readme.txt에 있는 것과 같은지 반드시 체크해 보십시오. (이 퍼미션 때문에 500 에러가 나는 경우가 의외로 많습니다.)

  3. 위의 1, 2번이 완벽하지만 여전히 500에러가 나는 경우에는, 실행하고자 하는 cgi파일이 UNIX용 아스키 파일인지 확인해 보십시오. (물론 이것은 windows NT을 사용하는 분들에게는 필요가 없습니다.)
    이것을 확인하는 방법은 계정의 셀 상태에서 vi를 사용합니다. 예를 들어 방명록의 경우 guestbook.cgi가 있는 디렉토리에서 vi guestbook.cgi 합니다.
    그렇게 해서 각 cgi파일을 vi에 로드했을 경우, 만약 UNIX용 CGI파일이 아닌 경우, 즉 PC용 아스키 파일인 경우 각 줄의 끝에 ^M이 붙어 있습 니다. 이런 경우에는 vi의 명령모드에서 :%s/^M//g 를 입력합니다. (여기서 ^M은 ctrl+V 를 입력하고 그 다음 ctrl+M 으로 입력합니다.) 그렇게 하면 ^M이 모두 없어지게 됩니다. 이제 ZZ를 눌러 vi를 종료합니다.
    vi의 사용이 귀찮고 어렵다면, 간단한 방법이 하나 있습니다. 분명 아스키 모드가 아니고, 바이너리모드로 업로드하여 유닉스용 아스키파일로 만들어지지 않은 경우, 계정의 쉘상태에서
    perl -i -pe 's/\015//g' *.cgi
    의 명령을 줍니다. 그렇게 하면 펄인터프리터가 해당 파일(여기서는 *.cgi)의 ^M을 모두 없애 줍니다.

    vi의 사용이 어렵고, 시스템에서 pico를 사용할 수 있는 경우에는 셀상태에서 "pico 파일이름" 하여 pico를 띄운 후, (pico에서는 PC용 아스키 파일이라 할지라도 ^M이 나타나지 않습니다.) 아무 글자나 한 자를 입력한 후 다시 그 글자를 지우고 ctrl+x로 저장을 하면 자동적으로 유닉스용 아스키 파일로 수정되어 저장됩니다.

    또한 vi나 pico 의 사용이 힘든 경우에는, 각 cgi 파일을 pc에서 계정으로 업로드할 때, 각 cgi 파일을 아스키 모드로 업로드하면 자동적으로 UNIX용 아스키모드로 업로드 됩니다.

    또한 PC에서 각 CGI파일을 수정할 때, UNIX 아스키 파일로 저장할 수 있는 에디터(edit master)를 사용하는 것도 한 방법입니다.

  4. 위의 1,2,3번이 완벽한 데도 server error가 난다면 각종 변수정의가 잘못된 경우일 수가 있습니다. 각종 변수정의는 각 스크립트의 압축 파일내에 포함된 readme.txt를 참조하십시오. 정의된 변수의 기정치를 사용하지 않는 경우, 즉 스크립트가 있는 디렉토리가 나머지 파일들이 있는 디렉토리와 다른 경우나, cgiwrap을 사용하는 경우에는 특히 변수정의에 주의해야 합니다. (readme.txt를 반드시 읽어 보십시오.)
    또 변수정의 중에 특히 많이 범하기 쉬운 오류는 절대경로를 사용하는 변수입니다. 절대경로는 말 그대로 그 시스템내에서 그 디렉토리의 (상대경로가 아닌) 절대 경로(full path)를 의미합니다. 절대 경로는 반드시 /로 시작해야 합니다. 이것을 빠뜨리는 것이 흔히 저지르는 일반적인 실수중의 하나입니다. 즉 반드시 '/home/users/myid/public_html/guestbook/guestbook.html' 등의 형태가 되어야 합니다.

  5. 또 하나 cgi를 수정하다가 저지르는 많은 실수 중의 하나는 " " 내에 또 " "를 넣는 경우입니다. 이 때에는 반드시 내부 " "앞에 \을 붙여야 합니다.
    예를 들어
    $abc = "<a href="http://www.abc.com/~foo/bar.html">abc</a>"; 는 잘못된 오류입니다. 반드시 $abc = "<a href=\"http://www.abc.com/~foo/bar.html\">abd</a>"; 와 같은 형태가 되어야 합니다.

  6. 500에러의 마지막에 쓰지만 빈번하게 일어나는 것중에 하나가 스크립트에서 언급한 펄의 위치와 사용하려는 서버 시스템에서의 펄의 위치가 다른 경우에도 에러가 일어납니다.
    실행가능한 펄 스크립트의 첫째 줄에는 언제나 펄인터프리터의 위치를 쓰도록 되어 있습니다. 그것을 보고 쉘은 그 파일이 펄스크립트인줄을 인식하게 되니까요. 예를 들어 #!/usr/local/bin/perl 등과 같이 언급 됩니다. 하지만 서버 시스템의 펄인터프리터의 위치가 /usr/bin 에 있다면 이 경우에는 펄스크립트들의 첫 줄을 모두 #!/usr/bin/perl 로 바꾸어주어야 합니다. 이것도 반드시 체크해 보아야 합니다.

  7. 기타 아래에서 언급하는 모든 에러들이 server error로 나올 수도 있습니다.

[ 501 Not Implemented Error (혹은 Not Supported Error) ]

이 에러는 크게 두 가지의 이유로 나타납니다.
그 하나는 말그대로 시스템에서 CGI를 지원하지 못하도록 막아 두었거나 CGI설정이 제대로 되어 있지 않는 경우에 일어납니다. 이것을 처리하는 방법은 자신이 시스템을 운영하거나 시스템의 구성파일을 사용할 수 있는 분이면 그 구성파일을 고쳐 주면 됩니다. 이 고치는 방법은 사용하는 웹서버에 따라서 모두 다르므로 언급하기가 힘듭니다만 NCSA서버의 경우를 예로 들면 구성파일이 들어 있는 디렉토리인 /usr/local/httpd/conf 디렉토리에서 srm.conf 파일 중 AddType application/x-httpd-cgi .cgi 로 설정해 주면 됩니다. 자신이 시스템을 운영하지 않고 계정을 부여받아 사용하는 경우 에는 해당 시스템의 웹마스터에게 CGI사용여부를 문의해 보는 것이 빠를 것입니다.

또 하나는 시스템의 구성(srm.conf)파일에서 CGI에 대해 .pl로 설정되어 있으면 .cgi 확장자를 가지는 파일을 실행시켰을 때, 이런 에러가 나게 되며 그 반대로 .cgi로 설정된 시스템에서 .pl 확장자를 가지는 파일을 실행했을 때도 일어납니다. 또 이 경우는 일부 시스템에서는 501에러로 처리하지 않고 바로 스크립트 그 자체가 화면에 디스플레이되는 곳도 있습니다. 이것은 시스템 사용자일 경우에는 첫번째 경우처럼 구성파일(srm.conf)을 수정해 줍니다. 그렇지 않은 분은 .pl 파일을 .cgi로, 혹은 .cgi파일을 .pl로 바꾸어 주는 것도 한 방법이 되겠습니다.

[403 Forbidden Error]

보통 permission문제입니다. (500에러의 3번을 참조하십시오.) 또는 인증관련 문서일 경우에는 인증을 위한 구성파일들의 설정이 제대로 되지 않는 경우일 수도 있습니다.

[404 Not found Error]

브라우저에서 해당 CGI파일의 정확한 URL을 입력하였는데 이 Error가 뜬다면 이것도 permission 문제입니다. 즉 해당 CGI파일이나 디렉토리의 퍼미션이 755로 되어 있지 않기 때문입니다.

[CGIwrap error]

cgiwrap은 CGI 스크립트를 그 소유자(owner)권한으로 작동시켜주는 프로그램으로서, 어떤 시스템에서는 이 cgiwrap을 통해서만 프로그램을 사용하도록 하고 있습니다. 이 cgiwrap을 사용할 때 일어나는 cgiwrap에러는 보통 두 가지 경우에 잘 일어납니다.
그 첫째는 사용하는 cgi 파일이 UNIX용 아스키 파일이 아닌 경우에 일어납니다. (이것은 500 Server Error 3번을 참조하십시오.)

또하나는 PERL INTERPRETER의 위치가 다른 경우입니다. 실행 가능한 펄 스크립트의 첫 줄에는 해당 시스템에 있는 PERL INTERPRETER 의 위치를 적어주게 됩니다.(#!/usr/local/bin/perl)
이것을 잘못 적었거나, 또는 PERL INTERPRETER의 위치가 다른 경우에 일어 납니다. PERL INTERPRETER가 시스템내의 어느 경로에 있는 가를 확인해 보려면 계정의 쉘 상태에서 which perl 을 입력해 보면 PERL의 디렉토리 가 나옵니다.
(예. perl이 /soft/sparc/bin 디렉토리에 위치해 있다면 첫 줄을 #!/soft/sparc/bin/perl 로 바꾸어 줍니다.)

또한 cgiwrap을 통해 대화방 사용시에 상단 프레임이 나타나지 않는 경우는 아래의 "기타 대화방 관련" 부분을 참고하십시오.

[스크립트가 실행되지 않고 코딩내용이 그대로 화면에 나올 경우]

CGI가 설정되어 있지 않거나, 또는 CGI설정시에 CGI파일을 .pl파일로 설정한 경우에 .cgi확장자를 가진 파일을 실행시키면, 그 파일을 cgi파일로 인식하지 못하므로 이렇게 나올 수가 있습니다. 그 반대로 .cgi확장자가 CGI파일로 설정된 시스템에서 .pl 확장자를 가지는 파일을 실행했을 때도 일어납니다.
(해결 방법은 위의 501 에러의 두 번째 경우를 참조하십시오.)

[해당 CGI의 디렉토리에 있는 index.html을 실행시켰는데 디렉토리에 있는 파일들의 리스트가 나열되는 경우 ]

이 경우는 보통 해당 디렉토리의 퍼미션을 잘못준 경우입니다. 해당 디렉토리 를 755로 열어 줍니다. (해당 스크립트의 readme.txt파일참조)

자료출처 : http://cgkim.co.kr/