Что такое компьютерная графика
CGI в настоящее время поддерживается NCSA, которая определяет CGI следующим образом:
CGI (Common Gateway Interface), Common Gateway Interface, — это программа, которая работает на сервере, таком как HTTP-сервер, и обеспечивает интерфейс с HTML-страницей клиента.
просмотр веб-страниц
Чтобы лучше понять, как работает CGI, мы можем начать с процесса нажатия ссылки или URL-адреса на веб-странице:
1. Используйте браузер для доступа к URL-адресу и подключитесь к веб-серверу HTTP.
2. После получения информации запроса веб-сервер проанализирует URL-адрес и проверит, существует ли файл, к которому осуществляется доступ, на сервере. Если файл существует, он вернет содержимое файла, в противном случае он вернет сообщение об ошибке.
3. Браузер получает информацию от сервера и отображает полученный файл или сообщение об ошибке.
Программы CGI могут представлять собой сценарии Python, сценарии PERL, сценарии SHELL, программы C или C++ и т. д.
Схема архитектуры CGI
Поддержка и настройка веб-сервера
Прежде чем приступать к программированию CGI, убедитесь, что ваш веб-сервер поддерживает CGI и настроил обработчик CGI.
Apache поддерживает конфигурацию CGI:
Настройте каталог CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Все программы CGI, исполняемые HTTP-сервером, сохраняются в предварительно настроенном каталоге. Этот каталог называется каталогом CGI и по соглашению называется /var/www/cgi-bin.
Файлы CGI имеют расширение .cgi, а Perl также может использовать расширение .pl.
По умолчанию конфигурация сервера Linux выполняется в каталоге cgi-bin в /var/www.
Если вы хотите указать другой каталог для запуска сценариев CGI, вы можете изменить файл конфигурации httpd.conf следующим образом:
<Directory "/var/www/cgi-bin"> AllowOverride Нет Опции +ExecCGI Порядок разрешить, запретить Разрешить из всех</Directory>
Добавьте суффикс .pl в AddHandler, чтобы мы могли получить доступ к файлам сценариев Perl, оканчивающимся на .pl:
AddHandler cgi-скрипт .cgi .pl .py
Первая программа CGI
Ниже мы создаем файл test.cgi, код следующий:
код test.cgi
#!/usr/bin/perl распечатать « Тип контента: текст/html r n r n » печать ; ' <html> ' ; печать ' <голова> ' ; печать ' <meta charset="utf-8"> ' ; печать ' <title>Учебное
пособие по программированию (codercto.com)</title> ' ; ' </head> ' ; печать ' <тело> ' ; печать ' <h2>Привет, Слово! </h2> ' ; ' <p>Первая программа CGI из Учебника программиста. </p> ' ; печать ' </body> ' ; печать ' </html> ' ; Затем откройте http://localhost/cgi-bin/test.cgi через браузер, результаты будут следующими:
Выходное содержимое первой строки сценария «Тип контента: text/htmlrnrn» отправляется в браузер и сообщает браузеру, что отображаемый тип контента — «text/html».
HTTP-заголовок
«Content-type:text/html» в содержимом файла test.cgi является частью HTTP-заголовка, который отправляется в браузер, чтобы сообщить ему тип содержимого файла.
Формат HTTP-заголовка следующий:
Имя поля HTTP: содержимое поля
Например:
Тип контента:текст/htmlrnrn
В следующей таблице представлена информация, обычно используемая в заголовках HTTP в программах CGI:
голова | описывать |
---|
Тип контента: | Запрошенная информация MIME, соответствующая объекту. Например: Тип контента:текст/html. |
Срок действия истекает: Дата | Дата и время окончания ответа |
Местоположение: URL-адрес | Используется для перенаправления получателя к местоположению незапрошенного URL-адреса для выполнения запроса или идентификации нового ресурса. |
Последнее изменение: Дата | Время последней модификации запрошенного ресурса |
Длина контента: N | Запрошенная длина контента |
Set-Cookie: строка | Установить HTTP-куки |
Переменные среды CGI
Все программы CGI получают следующие переменные среды, которые играют важную роль в программах CGI:
имя переменной | описывать |
---|
CONTENT_TYPE | Значение этой переменной среды указывает MIME-тип передаваемой информации. В настоящее время переменная среды CONTENT_TYPE обычно имеет вид: application/x-www-form-urlencoded, что указывает на то, что данные поступают из HTML-форм. |
CONTENT_LENGTH | Если методом передачи информации между сервером и программой CGI является POST, эта переменная среды представляет собой количество байтов действительных данных, которые можно прочитать из стандартного ввода STDIN. Эту переменную среды необходимо использовать при чтении введенных данных. |
HTTP_COOKIE | Содержимое COOKIE в клиенте. |
HTTP_USER_AGENT | Предоставьте информацию о браузере клиента, включая номера версий или другие конфиденциальные данные. |
ПУТЬ_ИНФО | Значение этой переменной среды представляет собой другую информацию о пути, следующую сразу за именем программы CGI. Он часто появляется как параметр программ CGI. |
QUERY_STRING | Если методом передачи информации между сервером и программой CGI является GET, значением этой переменной среды является передаваемая информация. Эта информация следует за именем программы CGI, разделенным вопросительным знаком «?». |
REMOTE_ADDR | Значение этой переменной среды — это IP-адрес клиента, отправляющего запрос, например 192.168.1.67 выше. Это значение всегда присутствует. И это уникальный идентификатор, который веб-клиент должен предоставить веб-серверу, который можно использовать в программах CGI для различения разных веб-клиентов. |
УДАЛЕННЫЙ_ХОСТ | Значение этой переменной среды содержит имя хоста клиента, отправившего запрос CGI. Если запрос, который вы хотите запросить, не поддерживается, нет необходимости определять эту переменную среды. |
REQUEST_METHOD | Предоставляет метод, с помощью которого вызывается сценарий. Для сценариев, использующих протокол HTTP/1.0, имеют смысл только GET и POST. |
SCRIPT_FILENAME | Полный путь к CGI-скрипту |
СКРИПТ_ИМЯ | Название CGI-скрипта |
СЕРВЕР_ИМЯ | Это имя хоста, псевдоним или IP-адрес вашего веб-сервера. |
SERVER_SOFTWARE | Значение этой переменной среды содержит имя и номер версии HTTP-сервера, вызывающего программу CGI. Например, значение выше — Apache/2.2.14(Unix). |
Ниже приведен простой сценарий CGI, который выводит переменные среды CGI:
Пример
#!/usr/bin/perl распечатать " Тип контента: text/html n n " печать ; ' <meta charset="utf-8"> ' ; печать " <font size=+1>Переменная среды:</font> n " ; ( сортировка ключи % ENV ) { распечатать " <b> $_ </b>: $ENV { $_ </br> n " } ; 1 ; Загрузка файла
Если мы хотим загружать файлы через Perl CGI, нам нужно установить другую информацию заголовка, как показано ниже:
Пример
#!/usr/bin/perl # HTTP-заголовок распечатать " Тип контента: приложение/октет-поток; имя = " Имя файла " r n " ; " Content-Disposition: Attachment; filename= " FileName " r n n " ; # Фактическое содержимое файла будет услышано. открыть ( ФАЙЛ , " <ИмяФайла " ) ; пока ( прочитайте ( ФАЙЛ , $buffer , 100 ) ) { печать ( " $ буфер " ) ; Передача данных методом GET
Метод GET отправляет закодированную информацию о пользователе на сервер. Информация о данных включается в URL-адрес запрошенной страницы, разделенный знаком «?», как показано ниже:
http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
Некоторые дополнительные примечания о запросах GET:
GET-запросы можно кэшировать
GET-запросы остаются в истории браузера.
GET-запросы можно добавить в закладки
Запросы GET не следует использовать при обработке конфиденциальных данных.
GET-запросы имеют ограничения по длине
GET-запросы следует использовать только для получения данных.
Простой пример URL-адреса: метод GET
Ниже приведен простой URL-адрес, который использует метод GET для отправки двух параметров в программу test.cgi:
/cgi-bin/test.cgi?name=Руководство по программированию&url=http://www.codercto.com
Ниже приведен код файла test.cgi:
Пример
#!/usr/bin/perl местный ( $buffer , @pairs , $pair , $name , $value , %FORM ) # Чтение текстовой информации ; $ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' } экв. " ПОЛУЧАТЬ " ) { $ buffer = $ENV { ' QUERY_STRING ' } ; # Чтение информации о паре имя/значение @pairs = разделение ( /&/, $ buffer ) ; $пара ( @пары ) { ( $name , $value ) = Split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) / например , $FORM { $ имя } = $значение } $name = $ FORM { имя } $ url = $FORM { url } ; « Тип контента: текст/html r n r n » печать ; " <html> " ; печать " <голова> " ; печать ' <meta charset="utf-8"> ' ; печать ' <title>Руководство по программированию (codercto.com) </title> ' ; " </head> " ; печать " <тело> " ; печать " <h2> $name URL: $url </h2> " печать ; " </body> " ; печать " </html> " 1 ; Проверьте браузер, и вывод будет следующим:
Пример простой формы: метод GET
Ниже представлена HTML-форма, использующая метод GET для отправки двух данных на сервер. Представленный серверный сценарий также является файлом test.cgi. Код test.html выглядит следующим образом:
Код файла test.html
< ! html > <html> <голова> < мета кодировка = " utf-8 " > <title> Учебное пособие по программированию ( codercto.com ) </title> </ голова > <тело> < форма действие = " /cgi-bin/test.cgi " метод = " получить " > имя сайта: < ввод тип = " текст " имя = " имя " > < шир. /> URL сайта: < ввод тип = " текст " имя = " URL " /> < ввод тип = " отправить " значение = « отправить » /> </форма> </body> </html> В браузере эффект выполнения следующий:
Передача данных с использованием метода POST
Более безопасно и надежно использовать метод POST для передачи данных на сервер. Некоторую конфиденциальную информацию, такую как пароли пользователей, необходимо использовать для передачи данных POST.
Ниже также приведен файл test.cgi, который также может обрабатывать данные формы POST, отправленные браузером:
код test.cgi
#!/usr/bin/perl местный ( $buffer , @pairs , $pair , $name , $value , %FORM ) # Чтение текстовой информации ; $ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' } экв. " ПОЧТА " ) { прочитайте ( STDIN , $buffer , $ ENV { ' CONTENT_LENGTH ' } ) еще ; { $ buffer = $ENV { ' QUERY_STRING ' } ; # Чтение информации о паре имя/значение @pairs = разделение ( /&/, $ buffer ) ; $пара ( @пары ) { ( $name , $value ) = Split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) / например , $FORM { $ имя } = $значение } $name = $FORM { имя } $ url = $FORM { url } печать ; « Тип контента: текст/html r n r n » печать ; " <html> " ; печать " <голова> " ; печать ' <meta charset="utf-8"> ' ; печать ' <title>Учебное
пособие по программированию (codercto.com)</title> ' ; " </head> " ; печать " <тело> " ; печать " <h2> $name URL: $url </h2> " печать ; " </body> " ; печать " </html> " 1 ; Ниже представлена HTML-форма, использующая метод GET для отправки двух данных на сервер. Представленный серверный сценарий также является файлом test.cgi. Код test.html выглядит следующим образом:
код test.html
< ! html > <html> <голова> < мета кодировка = " utf-8 " > <title> Учебное пособие по программированию ( codercto.com ) </title> </ голова > <тело> < форма действие = " /cgi-bin/test.cgi " метод = " post " > Имя сайта: < ввод тип = " текст " имя = " имя " > < шир. /> URL сайта: < ввод тип = " текст " имя = " URL " /> < ввод тип = " отправить " значение = « отправить » /> </форма> </body> </html> В браузере эффект выполнения следующий:
Передача данных флажка через программу CGI
Флажок используется для отправки одной или нескольких опций. Код test.html выглядит следующим образом:
код test.html
< ! html > <html> <голова> < мета кодировка = " utf-8 " > <title> Учебное пособие по программированию ( codercto.com ) </title> </ голова > <тело> < форма действие = " /cgi-bin/test.cgi " метод = " ПОСТ " цель = " _blank " > < ввод тип = " флажок " имя = " кодеркто " значение = " включено " /> Учебное пособие по программированию < input тип = " флажок " имя = " Гугл " значение = " включено " /> Google < ввод тип = " отправить " значение = " Выбрать сайт " /> </форма> </body> </html> Ниже приведен код файла test.cgi:
код test.cgi
#!/usr/bin/perl местный ( $buffer , @pairs , $pair , $name , $value , %FORM ) # Чтение информации ; $ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' } экв. " ПОЧТА " ) { прочитайте ( STDIN , $buffer , $ ENV { ' CONTENT_LENGTH ' } ) еще ; { $ buffer = $ENV { ' QUERY_STRING ' } ; # Чтение информации о паре имя/значение @pairs = разделение ( /&/, $ buffer ) ; $пара ( @пары ) { ( $name , $value ) = Split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) / например , $FORM { $ имя } = $значение } если ( $FORM { кодекто } ) { $codercto_flag = " ВКЛ " } еще { ; $ codercto_flag = « ВЫКЛ » } если ( $FORM { Google } ) { $google_flag = " ВКЛ " } еще { ; $ google_flag = " ВЫКЛ " } распечатать « Тип контента: текст/html r n r n » печать ; " <html> " ; печать " <голова> " ; печать ' <meta charset="utf-8"> ' ; печать ' <title>Учебное
пособие по программированию (codercto.com)</title> ' ; " </head> " ; печать " <тело> " ; печать " <h2> Выбранный статус Coder Tutorial: $codercto_flag </h2> " print ; " <h2> Статус выбора Google: $google_flag </h2> " print ; " </body> " ; печать " </html> " 1 ; В браузере эффект выполнения следующий:
Передача радиоданных через программу CGI
Радио передает на сервер только одни данные. Код test.html выглядит следующим образом:
код test.html
< ! html > <html> <голова> < мета кодировка = " utf-8 " > <title> Учебное пособие по программированию ( codercto.com ) </title> </ голова > <тело> < форма действие = " /cgi-bin/test.cgi " метод = " пост " цель = " _blank " > < ввод тип = " радио " имя = " сайт " значение = " кодеркто " /> Учебное пособие по программированию < input тип = " радио " имя = " сайт " значение = " Google " /> Google < ввод тип = " отправить " значение = « отправить » /> </форма> </body> </html> Код сценария test.cgi выглядит следующим образом:
код test.cgi
#!/usr/bin/perl местный ( $buffer , @pairs , $pair , $name , $value , %FORM ) # Чтение информации ; $ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' } экв. " ПОЧТА " ) { читать ( STDIN , $buffer , $ ENV { ' CONTENT_LENGTH ' } ) еще ; { $ buffer = $ENV { ' QUERY_STRING ' } ; # Чтение информации о паре имя/значение @pairs = разделение ( /&/, $ buffer ) ; $пара ( @пары ) { ( $name , $value ) = Split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) / например , $FORM { $ имя } = $значение } $сайт = $FORM { сайт } печать ; « Тип контента: текст/html r n r n » печать ; " <html> " ; печать " <голова> " ; печать ' <meta charset="utf-8"> ' ; печать ' <title>Учебное
пособие по программированию (codercto.com)</title> ' ; " </head> " ; печать " <тело> " ; печать " <h2> Выбранный сайт $site </h2> " print ; " </body> " ; печать " </html> " 1 ; В браузере эффект выполнения следующий:
Передача данных Textarea через программу CGI
Textarea передает на сервер несколько строк данных. Код test.html выглядит следующим образом:
код test.html
< ! html > <html> <голова> < мета кодировка = " utf-8 " > <title> Учебное пособие по программированию ( codercto.com ) </title> </ голова > <тело> < форма действие = " /cgi-bin/test.cgi " метод = " пост " цель = " _blank " > < текстовая область имя = " текстовое содержимое " столбцы = " 40 " rows = " 4 " > Введите сюда содержимое... </ textarea > < ввод тип = " отправить " значение = « отправить » /> </форма> </body> </html> Код сценария test.cgi выглядит следующим образом:
код test.cgi
#!/usr/bin/perl местный ( $buffer , @pairs , $pair , $name , $value , %FORM ) # Чтение информации ; $ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' } экв. " ПОЧТА " ) { прочитайте ( STDIN , $buffer , $ ENV { ' CONTENT_LENGTH ' } ) еще ; { $buffer = $ENV { ' QUERY_STRING ' } } ; # Чтение информации о паре имя/значение @pairs = разделить ( /&/, $ buffer ) ; $пара ( @пары ) { ( $name , $value ) = Split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) / например , $FORM { $ имя } = $значение } $text_content = $FORM { текстовое содержимое } печать ; « Тип контента: текст/html r n r n » печать ; " <html> " ; печать " <голова> " ; печать ' <meta charset="utf-8"> ' ; печать ' <title>Руководство по программированию (codercto.com) </title> ' ; " </head> " ; печать " <тело> " ; печать " <h2>Вводимое текстовое содержимое: $text_content </h2> " print ; " </body> " ; печать " </html> " 1 ; В браузере эффект выполнения следующий:
Передача раскрывающихся данных через программу CGI
HTML-код раскрывающегося списка выглядит следующим образом:
код test.html
< ! html > <html> <голова> < мета кодировка = " utf-8 " > <title> Учебное пособие по программированию ( codercto.com ) </title> </ голова > <тело> < форма действие = " /cgi-bin/test.cgi " метод = " пост " цель = " _blank " > < выбрать имя = " раскрывающийся список " > < вариант значение = " кодеркто " выбрано > Учебное пособие по программированию </ вариант > < вариант value = " google " > Google </ option > </выбрать> < ввод тип = " отправить " значение = " отправить " /> </форма> </body> </html> Код сценария test.cgi выглядит следующим образом:
код test.cgi
#!/usr/bin/perl местный ( $buffer , @pairs , $pair , $name , $value , %FORM ) # Чтение информации ; $ENV { ' REQUEST_METHOD ' } = ~ tr / a - z / A - Z /; ( $ENV { ' REQUEST_METHOD ' } экв. " ПОЧТА " ) { прочитайте ( STDIN , $buffer , $ ENV { ' CONTENT_LENGTH ' } ) еще ; { $ buffer = $ENV { ' QUERY_STRING ' } ; # Чтение информации о паре имя/значение @pairs = разделение ( /&/, $ buffer ) ; $пара ( @пары ) { ( $name , $value ) = Split ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / Pack ( " C " , hex ( $1 ) ) / например , $FORM { $ имя } = $значение } $site = $FORM { раскрывающийся список } ; « Тип контента: текст/html r n r n » печать ; " <html> " ; печать " <голова> " ; печать ' <meta charset="utf-8"> ' ; печать ' <title>Учебное
пособие по программированию (codercto.com)</title> ' ; " </head> " ; печать " <тело> " ; печать " <h2>Выбран веб-сайт: $site </h2> " print ; " </body> " ; печать " </html> " 1 ; В браузере эффект выполнения следующий:
Использование файлов cookie в CGI
Большим недостатком протокола http является то, что он не определяет личность пользователя, что доставляет программистам большие неудобства. Появление функции cookie компенсирует этот недостаток.
Файлы cookie записывают данные на жесткий диск клиента через браузер клиента, когда клиент обращается к сценарию. Информация о данных извлекается при следующем доступе клиента к сценарию, тем самым обеспечивая функцию распознавания личности. Файлы cookie часто используются для проверки личности.
Синтаксис файлов cookie
Отправка http-cookie осуществляется через http-заголовки, которые предшествуют передаче файлов. Синтаксис заголовка set-cookie следующий:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
name=name: необходимо установить значение cookie (имя не может использовать " ; " и " , "). Используйте " ; " для разделения нескольких значений имени, например: name1=name1;name2=name2;name3=name3 .
expires=date: срок действия cookie, формат: expires="Wdy,ДД-Пн-ГГГГ ЧЧ:ММ:СС"
path=path: установите путь, поддерживаемый файлами cookie. Если путь — это путь, файл cookie будет действовать для всех файлов и подкаталогов в этом каталоге. Например: path="/cgi-bin/". файл cookie вступит в силу. Указывает на вступление в силу этого файла, например: path="/cgi-bin/cookie.cgi".
домен=домен: доменное имя, эффективное для файлов cookie, например: домен="www.codercto.com"
безопасный: если указан этот флаг, это означает, что файл cookie может передаваться только через сервер https с протоколом SSL.
Получение файлов cookie достигается путем установки переменной среды HTTP_COOKIE. Программы CGI могут получать информацию о файлах cookie, получая эту переменную.
Настройки файлов cookie
Настройка файлов cookie очень проста: файл cookie будет отправлен отдельно в http-заголовке. В следующем примере задаются UserID и пароль, срок действия которых истекает в файлах cookie:
Пример
#!/usr/bin/perl распечатать " Set-Cookie:UserID=XYZ; n " ; печать " Set-Cookie:Password=XYZ123; n " ; " Set-Cookie:Expires=Вторник, 31 декабря 2017 г., 23:12:40 GMT " ; n " ;print " Set - Cookie : Domain = www . codercto com ; n " ; print " Set - Cookie : Path = / perl ; n " ;print " Тип содержимого : text / html r n r n " ;.......Другое HTML-содержимое Найти файлы cookie
Страница получения информации о файлах cookie очень проста. Информация о файлах cookie хранится в переменной среды CGI HTTP_COOKIE. Формат хранения следующий:
Пример
#!/usr/bin/perl $ rcvd_cookies = $ ENV { ' HTTP_COOKIE ' } ; @cookies = разделенный / ; $ rcvd_cookies ; $cookie ( @cookies ) { ( $key , $val ) = Split ( /=/, $cookie ) #
разбивается по первому =. $key =~ s /^ s +//; $val =~ s /^ s +//; $key =~
s / s +$//; $val =~ s / s +$/ /; если ( $ключ экв. " ID пользователя " ) { $user_id = $val } elsif ( $ key экв. " Пароль " ) { $пароль = $ знач } } распечатать « Идентификатор пользователя = $ user_id n » ; " Пароль = $пароль n " ; Выходной результат приведенного выше примера:
Идентификатор пользователя = XYZПароль = XYZ123
CGI-модуль
Perl предоставляет множество встроенных модулей CGI, обычно используются следующие два:
CGI-модуль
Беркли cgi-lib.pl