O melhor tutorial Programação Perl CGI em 2024. Neste tutorial você pode aprender O que é CGI,navegação na web,CGI Gráfico,configuração do servidor Web e suporte,cabeçalho HTTP,Variáveis CGI Ambiente,transferências,Use o método GET de transferência de dados,Use o método POST para passar dados,,a transferência de dados de rádio via programa CGI,transferir dados textarea via programa CGI,programa CGI para passar dados através do pull-down,CGI é usado biscoito,definições cookies,módulo CGI,
CGI atualmente mantido por NCSA, NCSA CGI é definido da seguinte forma:
CGI (Common Gateway Interface), Common Gateway Interface, que é um programa em execução no servidor, tais como: servidor HTTP, a interface do cliente fornecendo a mesma página HTML.
Para entender melhor como funciona CGI, podemos clicar em um link em uma página da web ou URL do processo:
programas CGI pode ser um script Python, script Perl, shell script, C ou programas em C ++.
Antes de realizar a programação CGI, certifique-se de que seu servidor Web tenha sido configurado para suportar CGI e manipulador de CGI.
Apache suporta configuração CGI:
Configure o diretório CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Todos servidor HTTP para executar programas CGI são armazenados em um diretório pré-configurado. Este diretório é chamado o diretório CGI e, por convenção, é nomeado / var / www diretório / cgi-bin.
extensão .cgi arquivo CGI, Perl também pode usar a extensão .pl.
Por padrão, a configuração do servidor Linux rodando diretório cgi-bin é / var / www.
Se você deseja especificar um diretório diferente para executar scripts CGI, você pode modificar o arquivo de configuração httpd.conf como segue:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
Acrescente o sufixo .pl AddHandler, para que possamos acessar o final do arquivo script Perl .pl:
AddHandler cgi-script .cgi .pl .py
A seguir, crie um arquivo test.cgi, o código é a seguinte:
#!/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;
Em seguida, abra seu navegador para http: //localhost/cgi-bin/test.cgi, resultados de saída são as seguintes:
A saída da primeira linha do script "Content-type: text / html \ r \ n \ r \ n" é enviado para o navegador e dizer ao navegador para exibir o tipo de conteúdo "text / html".
o conteúdo do arquivo test.cgi em: parte do cabeçalho HTTP é "Content-type text / html", que será enviado para o tipo de conteúdo do navegador diz que os arquivos do navegador.
formato do cabeçalho HTTP é a seguinte:
HTTP 字段名: 字段内容
Por exemplo:
Content-type:text/html\r\n\r\n
A tabela a seguir descreve as informações contidas nos programas CGI de cabeçalhos HTTP são frequentemente utilizados:
cabeça | descrição |
---|---|
Content-type: | MIME entidade correspondente ao pedido de informação. Por exemplo: Content-type: text / html |
Expira: Data | data e tempo de resposta expirou |
Localização: URL | Para redirecionar o destinatário a um pedido não-localização URL para completar o pedido ou identificação de novos recursos |
Última modificação: Data | recurso solicitado foi modificada pela última vez |
Content-length: N | pedido Content-Length |
Set-Cookie: String | configurações http biscoito |
Todos os programas CGI ter recebido as seguintes variáveis de ambiente, que desempenharam um papel importante no programa CGI:
nome da variável | descrição |
---|---|
CONTENT_TYPE | Este valor indica que a variável de ambiente para o tipo MIME de transferência de informação. No momento, as variáveis de ambiente são geralmente CONTENT_TYPE: application / x-www-form-urlencoded, ele disse que os dados do formulário HTML. |
CONTENT_LENGTH | Se as informações do servidor modo de transferência e um programa CGI é POST, mesmo se o ambiente de entrada de STDIN variável o número de bytes que podem ser lidos dados válidos do padrão. Esta variável ambiente durante a leitura os dados de entrada devem ser usadas. |
HTTP_COOKIE | conteúdo BOLINHO dentro do cliente. |
HTTP_USER_AGENT | O fornecimento de informações inclui o número da versão do navegador do cliente ou outros dados proprietários. |
PATH_INFO | O valor dessa variável de ambiente indica o nome do programa CGI imediatamente após as informações do caminho adicional. Muitas vezes aparece como um programa de argumento CGI. |
QUERY_STRING | Se as informações do servidor modo de transferência e um programa CGI é uma informação GET, o valor dessa variável de ambiente mesmo se passou. Esta informação é seguido pelo nome do programa CGI, tanto no meio com um ponto de interrogação '?' Separador. |
REMOTE_ADDR | O valor desta variável de ambiente é o endereço IP do cliente envia um pedido, por exemplo, o 192.168.1.67 acima. Este valor está sempre presente. E é a necessidade de fornecer o cliente Web para o identificador único do servidor Web pode ser utilizada em programas CGI para distinguir entre diferentes cliente Web. |
REMOTE_HOST | O valor dessa variável de ambiente contém o nome do host do cliente solicitante de CGI. Se ele não quiser verificar, você não precisa definir esta variável de ambiente. |
REQUEST_METHOD | Ele fornece um método chamado script. Para script / protocolo HTTP 1.0 única GET e POST significativa. |
SCRIPT_FILENAME | O caminho completo para os scripts CGI |
SCRIPT_NAME | O nome do script CGI |
SERVER_NAME | Este é o nome do host, alias ou endereço de IP do seu servidor Web. |
SERVER_SOFTWARE | O valor dessa variável de ambiente contém a chamada CGI nome do programa e número de versão do servidor HTTP. Por exemplo, o valor acima do Apache / 2.2.14 (Unix) |
Aqui está um script CGI simples variáveis de ambiente CGI saída:
#!/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;
Se queremos alcançar através Perl downloads de arquivos CGI, exigem um conjunto diferente de informações de cabeçalho da seguinte forma:
#!/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"); }
método GET para enviar as informações do usuário codificado para o servidor, as informações de dados está contido no URL da solicitação de página para o número dividido da seguinte forma "?":
http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2GET pedidos sobre alguns dos outros comentários:
O seguinte é uma URL simples, usando o método GET para enviar dois parâmetros para o programa test.cgi:
/cgi-bin/test.cgi?name=本教程&url=http://www.w3write.com
Um arquivo test.cgi código:
#!/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/%(pt)/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;
Verifique se o seu navegador, os resultados de saída são as seguintes:
Segue-se um período de dois enviar dados para o servidor usando o método GET através de um formulário HTML, apresentou o mesmo documento test.cgi script de servidor, test código é a seguinte:
<!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>
implementação do navegador dos resultados é como se segue:
Usando o método POST para passar dados para o servidor é mais seguro e confiável, como algumas informações confidenciais, como senhas de usuários precisa usar POST para transferir dados.
O seguinte também é test.cgi, ele também pode lidar com dados de formulário POST apresentados pelo navegador:
#!/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/%(pt)/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;
Segue-se um período de dois enviar dados para o servidor usando o método GET através de um formulário HTML, apresentou o mesmo documento test.cgi script de servidor, test código é a seguinte:
<!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>
implementação do navegador dos resultados é como se segue:
checkbox usado para enviar um ou mais dados de opção, test código é a seguinte:
<!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>
Um arquivo test.cgi código:
#!/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/%(pt)/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;
implementação do navegador dos resultados é como se segue:
Somente rádio transferir dados para um servidor, teste código é a seguinte:
<!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>
código de script test.cgi é a seguinte:
#!/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/%(pt)/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;
implementação do navegador dos resultados é como se segue:
passe textarea várias linhas de dados para o servidor, teste código é a seguinte:
<!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"> 在这里输入内容pt. </textarea> <input type="submit" value="提交" /> </form> </body> </html>
código de script test.cgi é a seguinte:
#!/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/%(pt)/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;
implementação do navegador dos resultados é como se segue:
HTML código da caixa drop-down da seguinte forma:
<!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>
código de script test.cgi da seguinte forma:
#!/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/%(pt)/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;
implementação do navegador dos resultados é como se segue:
protocolo HTTP em uma grande desvantagem é errado julgar a identidade de um usuário, o que dar aos programadores uma grande quantidade de inconveniência, mas parece funcionalidade de cookies compensou essa deficiência.
cookie que está acessando o script enquanto o cliente através do browser do cliente no disco rígido do cliente para escrever registros de dados, recuperar dados quando um cliente visita o próximo script, de modo a alcançar a função de determinar a identidade, biscoito comumente usado na verificação de identidade.
cookies HTTP é enviado através do cabeçalho HTTP para alcançar, ele teve de transferir arquivos, sintaxe de cabeçalho set-cookie é a seguinte:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
Definições cookies é muito simples, biscoito será enviado separadamente no cabeçalho HTTP. O exemplo a seguir define o UserID, senha e expira em um cookie:
#!/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"; ptptptptpt.其他 HTML 内容
Biscoito página de recuperação de informação é muito simples, no CGI variáveis de ambiente HTTP_COOKIE, o formato de armazenamento é a seguinte informações de cookie é armazenado:
#!/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";
O exemplo acima saída é:
User ID = XYZ Password = XYZ123
Perl CGI fornece muitos módulo built-in, usado os dois seguintes: