Latest web development tutorials

Programação Perl CGI

O que é 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.


navegação na web

Para entender melhor como funciona CGI, podemos clicar em um link em uma página da web ou URL do processo:

  • 1, use o navegador para acessar a URL e se conectar ao servidor HTTP web.
  • 2, servidor da Web recebe a mensagem de pedido será analisado URL e procurar arquivos acessados ​​no servidor se houver, se houver para retornar o conteúdo do arquivo, caso contrário ele retorna uma mensagem de erro.
  • 3, o navegador recebe as informações a partir do servidor e exibe as mensagens de arquivos ou erro recebido.

programas CGI pode ser um script Python, script Perl, shell script, C ou programas em C ++.


CGI Gráfico

cgiarch


configuração do servidor Web e suporte

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

O primeiro programa CGI

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>本教程(w3big.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".


cabeçalho HTTP

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

Variáveis ​​CGI Ambiente

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;

transferências

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");
}

Use o método GET de transferência de dados

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=value2
GET pedidos sobre alguns dos outros comentários:
  • GET pedido pode ser armazenado em cache
  • solicitação GET permanece no histórico do navegador
  • Recebo pedidos podem ser marcadas
  • Recebo pedidos não deve ser utilizado quando se lida com dados sensíveis
  • Recebo pedidos têm restrições de comprimento
  • Recebo pedidos só deve ser usado para recuperar dados

Exemplos de simples url: método GET

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.w3big.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/%(..)/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;

Verifique se o seu navegador, os resultados de saída são as seguintes:

Exemplos de forma simples: método GET

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.html código é a seguinte:

<!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>

implementação do navegador dos resultados é como se segue:


Use o método POST para passar dados

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/%(..)/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;

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.html código é a seguinte:

<!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>

implementação do navegador dos resultados é como se segue:

programa CGI para transmitir dados através da caixa de seleção

checkbox usado para enviar um ou mais dados de opção, test.html código é a seguinte:

<!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>

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/%(..)/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;

implementação do navegador dos resultados é como se segue:


a transferência de dados de rádio via programa CGI

Somente rádio transferir dados para um servidor, teste.html código é a seguinte:

<!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>

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/%(..)/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;

implementação do navegador dos resultados é como se segue:


transferir dados textarea via programa CGI

passe textarea várias linhas de dados para o servidor, teste.html código é a seguinte:

<!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>

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/%(..)/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;

implementação do navegador dos resultados é como se segue:


programa CGI para passar dados através do pull-down

HTML código da caixa drop-down da seguinte forma:

<!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>

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/%(..)/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;

implementação do navegador dos resultados é como se segue:


CGI é usado biscoito

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.

sintaxe bolinho

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 
  • name = name: para definir o valor do cookie (o nome não pode ser usado "," e "," número), quando há vários valores de nome ";" para separar, por exemplo: name1 = name1; name2 = name2 ; nome3 = nome3.
  • expira = Data: biscoito data de expiração no formato: expira = "Wdy, DD Mon-AAAA HH: MM: SS"
  • path = caminho: o caminho definido o suporte a cookies, se o caminho é um caminho, o cookie para todos os arquivos e subdiretórios do diretório entrada em vigor, por exemplo: path = "/ cgi-bin /", se o caminho é um arquivo, biscoito refere-se à entrada em vigor deste arquivo, por exemplo: path = "/ cgi-bin / cookie.cgi".
  • domain = domínio: o nome de domínio do cookie é válido, por exemplo: domain = "www.w3big.com"
  • seguro: Se este sinalizador é dada, que o cookie só pode ser transmitido através do servidor https protocolo SSL.
  • cookie é recebido, definindo as variáveis ​​de ambiente HTTP_COOKIE alcançado, programas CGI podem obter informações recuperando a variável cookie.

definições cookies

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.w3big.com;\n";
print "Set-Cookie:Path=/perl;\n";
print "Content-type:text/html\r\n\r\n";
...........其他 HTML 内容

encontrar bolinho

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

módulo CGI

Perl CGI fornece muitos módulo built-in, usado os dois seguintes: