Лучшее руководство по Perl CGI программирование в 2024 году. В этом руководстве вы можете изучить Что такое CGI,просмотр веб-страниц,CGI Chart,Конфигурация сервера Web и поддержка,заголовок HTTP,Переменные окружения CGI,Загрузки,Используйте метод GET передачи данных,Используйте метод POST для передачи данных,,Передача данных с помощью радио программы CGI,передача данных Textarea через программу CGI,CGI программа для передачи данных через раскрывающихся,CGI используется Cookie,настройки Cookie,модуль CGI,
CGI в настоящее время поддерживается NCSA, NCSA CGI определяется следующим образом:
CGI (Common Gateway Interface), Common Gateway Interface, который является программа, работающая на сервере, например: HTTP-сервер, клиентский интерфейс обеспечивает такой же HTML-страницу.
Чтобы лучше понять, как работает CGI, мы можем нажать на ссылку на веб-странице или URL процесса:
Программы CGI могут быть сценарий Python, Perl скрипт, скрипт SHELL, C или C ++ программ.
Перед тем, как проводить программирование 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
Ниже мы создаем файл 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>本教程(w3write.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".
содержание 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:
имя переменной | описание |
---|---|
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 метод для отправки закодированную информацию о пользователе на сервер, информационные данные, содержащиеся в URL запроса страницы на номер распределились следующим образом "?":
http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2GET запросы о некоторых из других комментариев:
Ниже приведен простой URL, используя метод GET для отправки два параметра программы test.cgi:
/cgi-bin/test.cgi?name=本教程&url=http://www.w3write.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/%(ru)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>$name网址:$url</h2>"; print "</body>"; print "</html>"; 1;
Проверьте свой браузер, выходные результаты являются следующими:
Ниже приводится две передачи данных на сервер с помощью метода GET через HTML-формы, который был представлен один и тот же сценарий сервера test.cgi документ, test код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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 для передачи данных.
Ниже также 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/%(ru)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>$name网址:$url</h2>"; print "</body>"; print "</html>"; 1;
Ниже приводится две передачи данных на сервер с помощью метода GET через HTML-формы, который был представлен один и тот же сценарий сервера test.cgi документ, test код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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>
Реализация Браузер результатов выглядит следующим образом:
Флажок используется для передачи одного или более опций данных, test код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/%(ru)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2> 本教程选中状态 : $w3big_flag</h2>"; print "<h2> Google 选择状态 : $google_flag</h2>"; print "</body>"; print "</html>"; 1;
Реализация Браузер результатов выглядит следующим образом:
Радио только передавать данные на сервер, test код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/%(ru)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2> 选择的网站 $site</h2>"; print "</body>"; print "</html>"; 1;
Реализация Браузер результатов выглядит следующим образом:
Textarea передать несколько строк данных на сервер, test код выглядит следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容ru. </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/%(ru)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>输入的文本内容为:$text_content</h2>"; print "</body>"; print "</html>"; 1;
Реализация Браузер результатов выглядит следующим образом:
HTML код выпадающий следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/%(ru)/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>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>选择的网站是:$site</h2>"; print "</body>"; print "</html>"; 1;
Реализация Браузер результатов выглядит следующим образом:
Протокол Http в большой недостаток, неправильно судить личность пользователя, которые дают программистам большое неудобство, но появляется функциональность печенья, составленную этот недостаток.
Cookie, который обращается скрипт, а клиент через браузер клиента на жестком диске клиента, чтобы сохранить записи данных, извлечения данных, когда клиент посещает следующий сценарий, с тем, чтобы достигнуть функции определения идентичности, печенье, обычно используемый в проверке подлинности личности.
Http печенье отправляется через заголовок HTTP, чтобы достигнуть, он должен был передавать файлы, синтаксис заголовка Set-Cookie выглядит следующим образом:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
Настройки 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.w3write.com;\n"; print "Set-Cookie:Path=/perl;\n"; print "Content-type:text/html\r\n\r\n"; rururururu.其他 HTML 内容
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
Perl CGI обеспечивает множество встроенных модулей, используются следующие два: