Axil S/E kdk015
1997. 4. 16
Kim Do Kyung
SUBJECT: CGI(Common Gateway Interface)
CONTENTS:
★ CGI(Common Gateway Interface)
CGI(Common Gateway Interface)는 정보를 제공하는 서버를 통해서 외부 프로그램이나
게이트웨이를 실행시키기 위한 인터페이스 프로그램을 말한다. 일반적으로 이것을 지
원하는 정보 제공 서버는 HTTP서버가 된다.
※ CGI 소개
* Gateway는 무엇인가?
o Gateway라는 것은 하나의 실제적인 프로그램으로서 정보요청을
관리하고 그에 따른 적절한 문서들을 생성 및 제공한다.
CGI는 서버가 제공하는 정보를 Client가 읽을 수 있는 형태로
전환한다. 즉, 이 둘 사이의교량 역할을 한다고 할 수 있다.
o Gateway는 여러가지 목적에 쓰일 수 있다.
그 중 가장 대표적인 것이 HTTP를 요구하는 ISINDEX와 FROM을 다루는
일이다.
※ CGI의 몇 가지 활용 예
o 매뉴얼을 HTML로 변환시켜서 그 결과를 Client에게 제공한다.
o WAIS 및 archie database와의 인터페이스 결과를 HTML로 변환시켜서 그
결과를 Client로 보낸다.
※ Gateway Program이란 정확히 무엇인가?
* Gateway Program(또는 script)은 독립적으로 실행 될 수 있는 실행
프로그램을 말한다. 왜냐하면 다양한 정보제공 서버하에서 실행 될 수 있게
하기 위해서이다.
※ Gateway를 만들기 위해서 어떠한 언어를 사용하는가?
* Gateway를 만들기 위해 필요한 언어는 실행화일을 생성할 수 있는 모든 언어를
포함한다.
* -C/C++
* -PERL
* -TCL
* -Bourne Shell
* -C Shell
* - ..
* - ..
※ CGI는 누가 만들었나?
HTTP 서버의 주요한 저자들에 의해서 작성되었다.
Tony Sanders sanders@bsdi.com
Ari Luotonen luotonen@ptsun00.cern.ch
George Phillips phillps@cs.ubc.ca
John Franks john@math.nwu.edu
※ CGI 프로그램 개요
서버로부터 gateway 프로그램으로의 인수전달은 어떻게 이루어지나?
Client가 URL을 요청할 때마다 서버는 그에 해당하는 gateway를 실행시킨다.
그리고 그 출력은 직접 혹은 간접적으로 client에게로 전달된다. CGI는 program으로
인수를 전달하기 위해서 환경변수를 이용한다.
그 대표적인 두가지 변수는 다음과 같다.
* QUERY_STRING
o 이것은 gateway를 접근하기 위해서 이용된 URL 속의 첫번째
물음표를(?) 뒤에 오는 것들을 정의하기 위해서 쓰인다. 이러한
정보들은 HTML ISINDEX 문서나 HTML form(get을 쓸때)에 의해서
첨가된다.
* PATH_INFO
o CGI는 URL에 첨가된 extra 정보를 허용하는데, 이것은 스크립트로
extra context-specific 정보를 전달하기 위해서 사용된다. 보통,URL의
gateway path 뒤에 따라가게 되며 서버에 의해서 decode되지는 않는다.
※ Gateway에서 client로의 문서 전달은 어떻게 이루어지나?
CGI 프로그램은 이미지나 HTML 문서,일반적인 문서 또는 audio clip과 같은
것들을 되돌려 주게 된다. 또한 다른 문서에 대한 reference를 돌려 줄 수 도
있다. 이러한 것들에 대한 정보를 client에게 알려주기 위해서 CGI는 출력의 앞
부분에 짧은 header 를 놓게된다. 이것을 마임이라 하고, 이와같은 문서를 직접 리턴할 때와 reference를
리턴할 때마다 각각의 경우에 header의 형식은 다음과 같다.
* MIME type의 완전한 문서의 경우:
MIME type에 관한 정보를 다음과 같이 명시한다.
Content-type : type/subtype
* 다른 문서에 대한 reference일 경우:
현재 서버 내의 문서일 경우에는 다음과 같이 할 수도 있다.
Location: /dir1/dir2/myfile.html
* 만일 고퍼서버 내의 문서를 참조할 경우에는 다음과 같이 하면 된다.
Location: gopher://httprules.foobar.org/0
이 경우 클라이언트는 이것을 decode하여 URL을 직접 가져올 것이다.
Header의 다음 라인은 반드시 공백라인이어야 한다. 이것은 header의 끝을
명시하기 위해서 이다.
-----------------------------------------------------------------------
CGI로 FORM을 지원하기
CGI는 Form data를 어떻게 넘겨 받는가?
다음 각 방법에 따라서 다른 방식이 적용된다.
o GET method 환경변수 QUERY_STRING을 통해서 전달된다.
o POST method stdin으로 입력한다. EOF를 명시하지 않음으로 변수
CONTENT_LENGTH를 사용해야 한다.
※ SSI(Server Side Include)
SSI는 여러분의 웹서버의 관리자가 활성화(enabled) 시켜야만 사용할 수 있다. 그
리고, 이것은 서버가 매 SSI 문서에 대해 더욱 열심히 동작할 것을 요구한다. (SSI
를 서버가 지원할 경우, 서버는 매 라인에 SSI 명령어가 있는지 확인해야 한다. 따
라서 서버에 과부하를 주게 된다.)
SSI의 형식은 주석 태그와 형태가 비슷하다.
HTML 태그의 주석
SSI 명령어 형식
SSI 명령어의 종류
-------------------------------------------------------------------
config 시간, 크기 와 에러 메시지의 포맷을 설정한다.
echo SSI 변수의 값을 웹 페이지에 삽입한다.
exec 시스템 명령어나 CGI 프로그램을 실행시키고 그것의 결과를
웹 페이지에 삽입한다.
fsize 파일의 크기를 웹 문서에 삽입한다.
flastmod 파일이 변경된 최종 시간을 웹 문서에 삽입한다.
include 명시한 HTML 파일을 웹 문서에 삽입한다.
-------------------------------------------------------------------
● config
config명령어의 argument와 argument 값
errmsg Any ASCII 텍스트
sizefmt Bytes or abbrev
timefmt Any of the date codes
config명령어의 각 argument의 사용예
웹 페이지에 어떻게 시간을 출력할 것인가에 관한 date 코드
%a 생략한 요일 이름
%A 생략하지 않은 요일 이름
%b 생략된 달 이름
%B 생략되지 않은 달 이름
%c 날짜와 시간 표시
%d 날짜(십진수)
%m 달(십진수)
%U 일요일을 처음으로 해서 요일 수(십진수)
%W 월요일을 처음으로 해서 요일 수(십진수)
%x 날짜 표시(시간은 없는)
%y 100단위 이상은 생략한 년도(십진수)
%Y 100단위 이상을 포함한 년도(십진수)
%H 24시간제에서의 시간(00-23)
%I 12시간제에서의 시간(01-12)
%j 날수(001-366)
%M 분(십진수)
%p a.m. 또는 p.m. 주어진 시간에 따라
%S 초(십진수)
%X 시간 표시(날짜는 없는)
%Z 시간대(Time Zone), 이름 또는 생략
● echo
echo 명령어의 변수와 그 의미
------------------------------------------------------------------
DATE_LOCAL 현재의 날짜와 시간, 이것의 출력 양식은 SSI의 config
timefmt에 의존한다.
DATE_GMT 그리니치 천문대의 현재의 날짜와 시간
DOCUMENT_NAME 파일 이름
DOCUMENT_URI 파일의 경로와 이름
LAST_MODIFIED 최종 변경된 날짜와 시간
------------------------------------------------------------------
echo명령어의 각 argument의 사용예
The file was last modified.
.
● exec
exec명령어의 사용예
exec의 argument로 실행시키는 프로그램은 Unis Shell이 될 수도 있다. 이때는 더
욱 강력한 위력을 발휘할 것이다. 하지만 CGI를 실행시킬 수 있다면 더욱 강력할
것이다. exec는 이것을 지원한다.
exec와 cgi의 사용 형식
● fsize
웹 페이지에 화일의 크기를 집어 넣을 때 사용된다.
● flastmod
여기서 잠시 상식하나를 짚고 넘어가면, flastmod란 이름은 last와 modified를 합 쳐서 만든 이름이다. 특히 접두어 f는 file에 대한 연산을 의미한다. 이 명령어는
우리의 웹 페이지가 가장 최근에 업데이트된 날짜를 자동으로 알릴 수 있는 방법
을 제공한다.
● include
include명령어의 argument와 argument 값
file 현 디렉토리나 현 디렉토리의 서브디렉토리에서 시작하는 어떤
경로나 화일
virtual 서버의 root에서 시작하는 어떤 경로나 화일
include명령어의 각 argument의 사용예
위의 표에 있듯이 argument가 file일 경우 현 디렉토리나 현 디렉토리의 서브디렉
토리가 되어야 한다. 따라서, 경로의 처음은 /, ..이 되어서는 안된다.
★ PERL
Larry Wall에 의해 만들어진 이 언어는 Practical Extraction and Report Language
의 약자로 이름에서 알 수 있듯이 원래 데이타를 처리하고 데이타로부터 보고서를
생성하기 위해 만들어 졌다. 또한, 이 언어의 최대 장점으로 PERL로 짜여진 프로그램
은 거의 별다른 수정없이 다른 플랫폼에서 실행이 가능하다는 것이다.
※ Hello World
Code
#! /usr/local/bin/perl
print "Content-type: text/html\n\n"; <= HTML 문서임을 알려줌
<주의>반드시 \n\n이어야 한다.
print <<`END` <= END가 있는곳까지 출력하라
My First CGI
My First CGI Program
Hello World?
END
PERL의 기본 코드이다.
※ Summary of Regular Expression
● set of pattern
/abc/
Matches abc anywhere within the string.
/^abc/
Matches abc at the beginning of the string.
/abc$/
Matches abc at the end of the string.
/a|b/
Matches either a or b
Can also be used with words (i.e., /perl|tcl/)
/ab{2,4}c/
Matches an a followed by 2-4 b's, followed by c.
If the second number is omitted, such as /ab{2,}c/,
the expression will match two or more b's.
/ab*c/
Matches an a followed by zero or more b's, followed by c
Expressions are greedy-it will match as many as possible.
Same as /ab{0,}c/
/ab+c/
Matches an a followed by one or more b's followed by c
Same as /ab{1,}c/
/ab?c/
Matches an a followed by an optional b followed by c
Same as /ab{0,1}c/. This has a different meaning in Perl 5.
In Perl 5, the expression:
/ab*?c/
matches an a followed by as few b's as possible(non-greedy)
/./
Matches any single character except a newline(\n)
/p..1/ matches a p followed by any two characters, followed by
1, so it will match such strings as perl, pall, pdgl, p3gl,
etc.
/[abc]/
A character class-matches any one of the three characters
listed. A pattern of /[abc]+/ matches strings such as
abcab, acbc, abbac, aaa, abcacbac, ccc, etc.
/\d/
Matches a digit
Same as /[0-9]/
Multipliers can be used (/\d+/ matches one or more digits)
/\w/
Matches a character classified as a word
Same as /[a-zA-Z0-9_]/
/\s/
Matches a character classified as whitespace
Same as /[ \r\t\n\f]/
/\b/
Matches a word boundary or a backspace
/test\b/ matches test, but not testing
However, \b matches a backspace character inside a class
(i.e., [\b])
/[^abc]/
Matches a character that is not in the class
/[^abc]+/ will match such strings as hello, test, perl, etc.
/\D/
Matches a character that is not a digit
Same as /[^0-9]/
/\W/
Matches a character that is not a word
Same as /[^a-zA-Z0-9_]/
/\S/
Matches a character that is not whitespace
Same as /[^ \r\t\n\f]/
/\B/
Requires that there is no word boundary
/hello\B/ matches hello, but not hello there
/\*/
Matches the * character, Use the \ character to escape
characters that have significance in a regular expression.
/(abc)/
Matches abc anywhere within the string, but the parentheses
act as memory, storing abc in the variables $1, $2, $3.
Example 1:
/name=(.*)/ will store zero or more characters after name= in variable $1.
Example 2:
/name=(.*)&user=\1/ will store zero or more characters after name= in $1.
Then, Perl will replace \1 with the value in $1, and check to see if the
pattern matches.
Example 3:
/name=([^&]*) will store zero or more characters after name= but before
the & character in variable $1.
Example 4:
/name=([^&]+)&age=(.*)$/ will store one or more characters after name= but
before & in $1. It then matches the & character. All characters after
age= but before the end of the line are stored in $2.
/abc/i
Ignores case. Matches either abc, Abc, ABC, aBc, aBC, etc.