Latest web development tutorials

펄 CGI 프로그래밍

CGI는 무엇인가

다음과 같이 현재 NCSA에 의해 유지 CGI는 NCSA의 CGI 정의된다 :

CGI (공통 게이트웨이 인터페이스)와 같은 서버에서 실행되는 프로그램이며, 공통 게이트웨이 인터페이스 : HTTP 서버와 같은 HTML 페이지를 제공하는 클라이언트 인터페이스.


웹 브라우징

더 나은 CGI 작동 방식을 이해하기 위해, 우리는 프로세스의 웹 페이지 또는 URL에 링크를 클릭 할 수 있습니다 :

  • 하나는 HTTP 웹 서버에 URL에 액세스하여 연결하는 브라우저를 사용합니다.
  • 도 2를 참조하면, 웹 서버는, 그렇지 않으면 에러 메시지를 반환 요청 메시지는 URL을 해석하고 파일의 내용을 리턴 있다면,이 경우 서버에 액세스 한 파일을보고한다 수신한다.
  • 도 3을 참조하면, 브라우저는 서버로부터 정보를 수신하고, 수신 된 파일 또는 에러 메시지를 표시한다.

CGI 프로그램은 파이썬 스크립트, PERL 스크립트, 쉘 스크립트, C 또는 C ++ 프로그램이 될 수 있습니다.


CGI 차트

cgiarch


웹 서버 구성 및 지원

당신이 CGI 프로그래밍을 수행하기 전에 웹 서버가 CGI 및 CGI 처리기를 지원하도록 구성되어 있는지 확인하십시오.

아파치는 CGI 구성을 지원합니다 :

는 CGI 디렉토리를 설정합니다 :

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

CGI 프로그램을 실행하는 모든 HTTP 서버에서 사전 구성된 디렉토리에 저장된다. 이 디렉토리는 CGI 디렉토리라고하며, 규칙에 따라, 그것은는 / var / www /에서의 cgi-bin 디렉토리 지정됩니다.

CGI 파일 확장자가 .cgi는, 펄은 통해 .pl 확장자를 사용할 수 있습니다.

기본적으로 CGI-bin 디렉토리를 실행하는 리눅스 서버 구성은 / var / www가있다.

당신이 CGI 스크립트를 실행하려면 다른 디렉토리를 지정하려면 다음과 같이 당신은 httpd.conf 구성 파일을 수정할 수 있습니다 :

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI
   Order allow,deny
   Allow from all
</Directory>

AddHandler에 .pl로 접미사를 추가, 그래서 우리는 .pl로 Perl 스크립트 파일의 끝 부분에 액세스 할 수 있습니다 :

AddHandler cgi-script .cgi .pl .py

첫 번째 CGI 프로그램

우리가 test.cgi 파일을 생성 아래 다음과 같이 코드 :

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! </h2>';
print '<p>来自本教程第一个 CGI 程序。</p>';
print '</body>';
print '</html>';

1;

그런 다음 브라우저에서 http를 열고 다음과 같이 //localhost/cgi-bin/test.cgi, 출력 결과는 다음과 같습니다 :

스크립트의 첫 번째 줄의 출력은 "콘텐츠 유형 : 텍스트 / html로 \ 연구 \ 없음 \ 연구 \ n"은 브라우저로 전송하고 콘텐츠 형식이 "text / html로"를 표시하는 브라우저에게 있습니다.


HTTP 헤더

에 test.cgi 파일 내용 : HTTP 헤더의 부분은,이 브라우저 콘텐츠 형식으로 전송됩니다 "콘텐츠 형식 text / html과"입니다 브라우저 파일을 알려줍니다.

다음과 같이 HTTP 헤더 형식은 다음과 같습니다

HTTP 字段名: 字段内容

예를 들면 :

Content-type:text/html\r\n\r\n

다음 표는 HTTP 헤더 CGI 프로그램의 정보가 종종 사용된다 설명 :

머리 기술
콘텐츠 형식 : 상기 정보 요구에 상응하는 MIME 엔티티. 예를 들어 콘텐츠 유형 : 텍스트 / html로
만료 날짜 : 응답 일시 만료
위치 : URL 새로운 리소스의 요청 또는 식별을 완료되지 않은 위치 URL 요청에받는 리디렉션
마지막으로 수정 된 날짜 : 요청 된 자원이 마지막으로 수정
콘텐츠 길이 : N 콘텐츠 길이 요청
설정 - 쿠키 : 문자열 HTTP 쿠키 설정

CGI 환경 변수

모든 CGI 프로그램은 CGI 프로그램에 중요한 역할을 다음과 같은 환경 변수를 받았다 :

변수 이름 기술
CONTENT_TYPE 이 값을 나타내는 정보 전송의 MIME 타입에 대한 환경 변수있다. 현재, 환경 변수는 일반적으로 CONTENT_TYPE 있습니다 : 응용 프로그램 / x-www-form-urlencoded를, 그는 말했다 HTML 양식의 데이터.
CONTENT_LENGTH 전송 모드 서버와 CGI 프로그램 정보, POST 경우 경우에도 환경 변수 STDIN 입력 표준에서 유효한 데이터를 읽을 수있는 바이트의 수. 입력 데이터를 판독이 환경 변수는 사용되어야한다.
HTTP_COOKIE 클라이언트 내에서 COOKIE 내용.
HTTP_USER_AGENT 정보를 제공하는 것은 클라이언트 브라우저 또는 다른 소유 데이터의 버전 번호를 포함한다.
PATH_INFO 이 환경 변수의 값은 즉시 추가적인 경로 정보 후 CGI 프로그램의 이름을 나타낸다. 그것은 종종 인수 CGI 프로그램으로 나타납니다.
QUERY_STRING 전송 모드 서버와 CGI 프로그램 정보 인 경우 정보가 전달 된 경우에도 이러한 환경 변수의 값을 얻는다. 이 정보는 물음표 '?'세퍼레이터 가운데 둘은 CGI 프로그램의 이름 따른다.
REMOTE_ADDR 이 환경 변수의 값은, 클라이언트의 IP 어드레스는, 예를위한 요구를, 상기 192.168.1.67를 보낸다. 이 값은 항상 존재한다. 그리고 웹 서버의 고유 식별자에 웹 클라이언트가 상이한 웹 클라이언트를 구별하는 CGI 프로그램에 사용될 수 제공 할 필요가있다.
REMOTE_HOST 이 환경 변수의 값은 CGI의 요청 클라이언트의 호스트 이름을 포함한다. 당신이 확인하지 않는 경우,이 환경 변수를 정의 할 필요가 없습니다.
REQUEST_METHOD 이 스크립트라는 방법을 제공한다. HTTP / 1.0 프로토콜 스크립트에만 GET과 POST 의미.
SCRIPT_FILENAME CGI 스크립트의 전체 경로
SCRIPT_NAME CGI 스크립트의 이름
SERVER_NAME 이것은 당신의 웹 서버의 호스트 이름, 별명 또는 IP 주소입니다.
SERVER_SOFTWARE 이 환경 변수의 값은 HTTP 서버의 전화 CGI 프로그램 이름 및 버전 번호를 포함한다. 예를 들어, 아파치 / 2.2.14 (유닉스)의 위의 값

다음은 간단한 CGI 스크립트 출력 CGI 환경 변수입니다 :

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print '<meta charset="utf-8">';
print "<font size=+1>环境变量:</font>\n";
foreach (sort keys %ENV)
{
  print "<b>$_</b>: $ENV{$_}<br>\n";
}

1;

다운로드

우리는 펄 CGI 파일 다운로드를 통해 달성하고자하는 경우 다음과 같이 헤더 정보의 다른 세트가 필요합니다 :

#!/usr/bin/perl

# HTTP Header
print "Content-Type:application/octet-stream; name=\"FileName\"\r\n";
print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n";

# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) )
{
   print("$buffer");
}

데이터 전송의 GET 메소드를 사용하여

서버에 상기 인코딩 된 사용자 정보를 전송하는 방법을 얻는, 상기 데이터 정보는 다음과 같이 나눌 수 페이지 요청의 URL에 포함 된 "?"

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
다른 의견의 일부에 대한 요청을 GET :
  • GET 요청은 캐시 할 수 있습니다
  • GET 요청은 브라우저 기록에 남아
  • 요청 북마크 할 수 있습니다 GET
  • 민감한 데이터를 처리 할 때 요청이 사용되어서는 안 GET
  • GET 요청은 길이 제한이
  • 요청은 데이터를 검색하는 데 사용되어야 GET

단순 URL의 예 : 방법을 GET

다음은 test.cgi 프로그램에 두 개의 매개 변수를 전송하는 GET 메소드를 사용하여 간단한 URL입니다 :

/cgi-bin/test.cgi?name=本教程&url=http://www.w3big.com

코드 test.cgi 파일 :

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET")
{
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

다음과 같이 브라우저를 확인, 출력 결과는 다음과 같습니다

간단한 형태의 예 : 방법을 GET

다음 다음은 두 가지가 HTML 폼 통해 GET 방법을 사용하여 서버에 데이터를 송신하고, 동일한 서버 스크립트 test.cgi 문서를 제출 test.html를 코드 :

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="get">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

다음과 같이 결과의 브라우저 구현은 다음과 같습니다


데이터를 전달하기 위해 POST 메서드를 사용하여

서버가 더 안전하고 신뢰할하는 POST 메소드를 사용하여 사용자 암호 데이터를 전송하기 위해 POST를 사용할 필요가 민감한 정보와 같은 데이터를 전달한다.

다음은 또한 브라우저가 제출 POST의 형태로 데이터를 처리 할 수있다 test.cgi :

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

다음 다음은 두 가지가 HTML 폼 통해 GET 방법을 사용하여 서버에 데이터를 송신하고, 동일한 서버 스크립트 test.cgi 문서를 제출 test.html를 코드 :

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

다음과 같이 결과의 브라우저 구현은 다음과 같습니다

CGI 프로그램은 체크 박스를 통해 데이터를 전달하는

다음과 같이 하나 이상의 옵션 데이터를 전송하는 데 사용 체크 박스, test.html를 코드는 다음과 같습니다

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="POST" target="_blank">
<input type="checkbox" name="w3big" value="on" /> 本教程
<input type="checkbox" name="google" value="on" /> Google
<input type="submit" value="选择站点" />
</form>
</body>
</html>

코드 test.cgi 파일 :

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
if( $FORM{w3big} ){
   $w3big_flag ="ON";
}else{
   $w3big_flag ="OFF";
}
if( $FORM{google} ){
   $google_flag ="ON";
}else{
   $google_flag ="OFF";
}

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 本教程选中状态 : $w3big_flag</h2>";
print "<h2> Google 选择状态 : $google_flag</h2>";
print "</body>";
print "</html>";

1;

다음과 같이 결과의 브라우저 구현은 다음과 같습니다


CGI 프로그램을 통해 무선 데이터 전송

다음 라디오 만 서버로 데이터를 전송하고, test.html를 코드 :

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<input type="radio" name="site" value="w3big" /> 本教程
<input type="radio" name="site" value="google" /> Google
<input type="submit" value="提交" />
</form>
</body>
</html>

다음과 같이 test.cgi 스크립트 코드는 다음과 같습니다

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{site};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 选择的网站 $site</h2>";
print "</body>";
print "</html>";

1;

다음과 같이 결과의 브라우저 구현은 다음과 같습니다


CGI 프로그램을 통해 텍스트 영역의 데이터를 전송

다음과 같이 서버에 데이터의 여러 행 텍스트 영역 패스, test.html를 코드는 다음과 같습니다

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
在这里输入内容...
</textarea>
<input type="submit" value="提交" />
</form>
</body>
</html>

다음과 같이 test.cgi 스크립트 코드는 다음과 같습니다

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>输入的文本内容为:$text_content</h2>";
print "</body>";
print "</html>";

1;

다음과 같이 결과의 브라우저 구현은 다음과 같습니다


CGI 프로그램 풀다운을 통해 데이터를 전달

HTML 드롭 다운 상자 코드를 다음과 같이 :

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<select name="dropdown">
<option value="w3big" selected>本教程</option>
<option value="google">Google</option>
</select>
<input type="submit" value="提交"/>
</form>
</body>
</html>

test.cgi 스크립트 코드를 다음과 같이 :

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>选择的网站是:$site</h2>";
print "</body>";
print "</html>";

1;

다음과 같이 결과의 브라우저 구현은 다음과 같습니다


CGI는 쿠키를 사용합니다

큰 단점에서 HTTP 프로토콜은 프로그래머에게 불편의 큰 거래를 제공하여 사용자의 신원을 판단 할 문제이지만,이 결핍 위해 만든 쿠키 기능이 나타납니다.

ID를 결정하는 기능을 달성하도록 클라이언트 하드 디스크에 고객의 브라우저를 통해 고객이 고객이 다음 스크립트를 방문 할 때 데이터를 검색, 데이터 레코드를 작성하는 동안 스크립트에 액세스 쿠키는 쿠키 일반적 신원 확인에 사용했다.

쿠키 구문

다음과 같이 HTTP 쿠키를 달성하기 위해 HTTP 헤더를 통해 전송되고, 그 파일을 전송했다, 헤더 설정 쿠키 구문은 다음과 같습니다

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • 이름 = 이름 :; 여러 이름 값이있는 경우 (번호 ""및 ""이름이 사용될 수 없다) 쿠키의 값을 ";", 예를 들어 분리 : NAME1 = NAME1; NAME2 = NAME2 ; NAME3 = NAME3.
  • 형식 쿠키 유효 기간 : = 날짜를 만료 = "Wdy, DD- 만료 월 - YYYY의 HH를 : MM를 : SS를"
  • 경로 = 경로 : 경로 설정 쿠키 지원, 경로, 예를 들어 경로, 발효 디렉토리 엔트리의 모든 파일 및 서브 디렉토리의 쿠키 인 경우 : 경로 = "/ CGI-빈 /" 경로가 파일 인 경우, 쿠키 그것은 예를 들어,이 파일의 발효를 의미 = "이 방법으로 / cgi-bin / cookie.cgi"경로입니다.
  • 도메인 = 도메인 : 쿠키의 도메인 네임 예를 들어, 유효 : 도메인 = "www.w3big.com"
  • 고정이 플래그가 지정된 경우에만 쿠키 SSL 프로토콜 HTTPS 서버를 통해 전송 될 수있다.
  • 쿠키는 쿠키 변수를 검색하여 정보를 얻을 수 있고, 환경 변수 HTTP_COOKIE 달성 CGI 프로그램을 설정하여 수신된다.

쿠키 설정

쿠키 설정, 쿠키는 HTTP 헤더에 개별적으로 매우 간단 전송됩니다된다. 다음 예는 사용자 ID, 암호를 설정하고 쿠키에 만료 :

#!/usr/bin/perl

print "Set-Cookie:UserID=XYZ;\n";
print "Set-Cookie:Password=XYZ123;\n";
print "Set-Cookie:Expires=Tuesday, 31-Dec-2017 23:12:40 GMT";\n";
print "Set-Cookie:Domain=www.w3big.com;\n";
print "Set-Cookie:Path=/perl;\n";
print "Content-type:text/html\r\n\r\n";
...........其他 HTML 内容

쿠키 찾기

쿠키 정보 검색 페이지는 쿠키 정보가 저장되어 다음과 같이 CGI 환경 변수 HTTP_COOKIE으로, 저장 형식은 매우 간단하다 :

#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ){
   ($key, $val) = split(/=/, $cookie); # splits on the first =.
   $key =~ s/^\s+//;
   $val =~ s/^\s+//;
   $key =~ s/\s+$//;
   $val =~ s/\s+$//;
   if( $key eq "UserID" ){
      $user_id = $val;
   }elsif($key eq "Password"){
      $password = $val;
   }
}
print "User ID  = $user_id\n";
print "Password = $password\n";

위 예제의 출력은 다음과 같습니다

User ID = XYZ
Password = XYZ123

CGI 모듈

펄 CGI는 많은 내장 모듈을 제공, 두 가지를 다음 사용 :