Latest web development tutorials

Perl CGI программирование

Что такое CGI

CGI в настоящее время поддерживается NCSA, NCSA CGI определяется следующим образом:

CGI (Common Gateway Interface), Common Gateway Interface, который является программа, работающая на сервере, например: HTTP-сервер, клиентский интерфейс обеспечивает такой же HTML-страницу.


просмотр веб-страниц

Чтобы лучше понять, как работает CGI, мы можем нажать на ссылку на веб-странице или URL процесса:

  • 1, использовать браузер для доступа к URL и подключиться к HTTP веб-сервер.
  • 2, Web-сервер получает сообщение с запросом будет анализироваться URL и посмотреть получил доступ к файлам на сервере, если есть, если есть, чтобы вернуть содержимое файла, в противном случае она возвращает сообщение об ошибке.
  • 3, браузер получает информацию с сервера и отображает полученный файл или сообщения об ошибках.

Программы CGI могут быть сценарий Python, Perl скрипт, скрипт SHELL, C или C ++ программ.


CGI Chart

cgiarch


Конфигурация сервера Web и поддержка

Перед тем, как проводить программирование CGI, убедитесь, что ваш веб-сервер был настроен для поддержки CGI и обработчик CGI.

Apache поддерживает конфигурацию CGI:

Настройка каталога CGI:

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

Все сервера HTTP для выполнения программы CGI сохраняются в предварительно сконфигурированной директории. Этот каталог называется каталог CGI, а также по соглашению, он называется / вар / WWW / CGI-BIN каталога.

CGI расширение файла .cgi, Perl может также использовать расширение .pl.

По умолчанию, конфигурация сервера Linux работает каталог CGI-BIN является / Var / WWW.

Если вы хотите указать другой каталог для запуска CGI скриптов, вы можете изменить файл конфигурации httpd.conf следующим образом:

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

Добавьте суффикс .pl AddHandler, так что мы можем получить доступ к конец .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, выходные результаты являются следующими:

Выход первой строке сценария "Content-Type: Текст / html \ г \ п \ г \ п" отправляется в браузер и сообщить браузеру, чтобы отобразить тип содержимого "текст / html".


заголовок HTTP

содержание test.cgi файлов в: часть заголовка HTTP является "Content-Type текст / html", он будет направлен к типу контента браузер сообщает файлы браузера.

Формат заголовка HTTP, выглядит следующим образом:

HTTP 字段名: 字段内容

Например:

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

В следующей таблице приведены сведения в программах CGI заголовка HTTP часто используются:

руководитель описание
Content-Type: MIME-объект, соответствующий запросу информации. Например: Content-Type: Текст / html
Истекает: Дата дата и время отклика истекло
Расположение: URL Чтобы перенаправить получателя на запрос, не расположение URL для выполнения запроса или идентификации новых ресурсов
Последнего изменения: Дата Запрошенный ресурс Последнее изменение
Content-Length: N Запрос Content-Length
Set-Cookie: String Настройки Http Cookie

Переменные окружения CGI

Все программы CGI получили следующие переменные окружения, которые сыграли важную роль в программе CGI:

имя переменной описание
CONTENT_TYPE Это значение указывает на то, что переменная окружения к MIME типа передачи информации. В настоящее время переменные среды, как правило, CONTENT_TYPE: применение / х-WWW-форм-urlencoded, он сказал, что данные из HTML-формы.
CONTENT_LENGTH Если информация о режиме передачи сервера и программа CGI является POST, даже если переменная окружения ввода STDIN число байтов, которые можно прочитать достоверные данные от стандарта. Эта переменная окружения при чтении входных данных должны быть использованы.
HTTP_COOKIE содержание COOKIE в клиенте.
HTTP_USER_AGENT Предоставление информации включает в себя номер версии браузера клиента или других собственных данных.
PATH_INFO Значение этой переменной среды указывает имя программы CGI сразу после получения дополнительной информации о пути. Он часто появляется в качестве аргумента программы CGI.
QUERY_STRING Если информация о режиме передачи сервера и программы CGI информация GET, значение этой переменной окружения, даже если он будет принят. Эта информация следует имя программы 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 Значение этой переменной окружения содержит вызов CGI название программы и номер версии сервера HTTP. Например, указанное выше значение Apache / 2.2.14 (Unix)

Вот простой 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;

Загрузки

Если мы хотим достичь с помощью Perl 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 передачи данных

GET метод для отправки закодированную информацию о пользователе на сервер, информационные данные, содержащиеся в URL запроса страницы на номер распределились следующим образом "?":

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
GET запросы о некоторых из других комментариев:
  • GET запрос может быть кэширован
  • запрос GET остается в истории браузера
  • GET запросы могут быть закладкой
  • GET запросов не следует использовать при работе с конфиденциальными данными
  • GET запросы имеют ограничения длины
  • GET запросы должны быть использованы только для получения данных

Примеры простых URL: Получ

Ниже приведен простой URL, используя метод GET для отправки два параметра программы test.cgi:

/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-формы, который был представлен один и тот же сценарий сервера 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 для передачи данных.

Ниже также test.cgi, он также может обрабатывать данные формы POST, представленные в браузере:

#!/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;

Ниже приводится две передачи данных на сервер с помощью метода GET через HTML-формы, который был представлен один и тот же сценарий сервера 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;

Реализация Браузер результатов выглядит следующим образом:


передача данных Textarea через программу CGI

Textarea передать несколько строк данных на сервер, 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 используется Cookie

Протокол Http в большой недостаток, неправильно судить личность пользователя, которые дают программистам большое неудобство, но появляется функциональность печенья, составленную этот недостаток.

Cookie, который обращается скрипт, а клиент через браузер клиента на жестком диске клиента, чтобы сохранить записи данных, извлечения данных, когда клиент посещает следующий сценарий, с тем, чтобы достигнуть функции определения идентичности, печенье, обычно используемый в проверке подлинности личности.

синтаксис печенья

Http печенье отправляется через заголовок HTTP, чтобы достигнуть, он должен был передавать файлы, синтаксис заголовка Set-Cookie выглядит следующим образом:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • Имя = имя: установить значение куки (имя не может быть использована "," и "," номер), когда есть несколько значений имен "," отделить, например: name1 = name1; имя2 = имя2 ; name3 = NAME3.
  • истекает = дата: дата окончания срока действия куки в формате: истекает = "Wdy, dd- пн-YYYY HH: MM: SS"
  • путь = путь: путь установить поддержку куки, если путь есть путь, куки для всех файлов и подкаталогов записи каталога в силу, например: путь = "/ CGI-BIN /", если путь файла, печенье Это относится к вступлению в силу этого файла, например: путь = "/ CGI-BIN / cookie.cgi".
  • домен = домен: доменное имя куки действительна, например: домен = "www.w3big.com"
  • обеспечить: Если этот флаг задан, что печенье может передаваться только через сервер HTTPS протокола SSL.
  • печенье получена путем установки переменных окружения HTTP_COOKIE достигнуты, программы CGI может получать информацию, извлекая переменную куки.

настройки Cookie

Настройки Cookie очень просто, печенье будет отправлено отдельно в заголовке HTTP. Следующий пример устанавливает идентификатор пользователя, пароль и истекает в куки:

#!/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 内容

Найти Cookie

Cookie страницы информационного поиска очень проста, в CGI переменные окружения HTTP_COOKIE, формат хранения выглядит следующим образом информация 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

Perl CGI обеспечивает множество встроенных модулей, используются следующие два: