Latest web development tutorials

La programación Perl CGI

¿Qué es CGI

CGI actualmente mantenido por NCSA, NCSA CGI se define como sigue:

CGI (Common Gateway Interface), Common Gateway Interface, que es un programa que se ejecuta en el servidor, como por ejemplo: servidor HTTP, la interfaz del cliente proporcionando la misma página HTML.


navegación web

Para entender mejor cómo funciona CGI, podemos hacer clic en un enlace en una página web o URL del proceso:

  • 1, utilizar el navegador para acceder a la URL y conectarse con el servidor web HTTP.
  • 2, el servidor Web recibe el mensaje de solicitud será analizada URL y buscar los archivos a los que accede en el servidor si hay, si hay que devolver el contenido del archivo, de lo contrario, devuelve un mensaje de error.
  • 3, el navegador recibe la información desde el servidor y muestra los mensajes de error o de archivos recibidos.

Los programas CGI pueden ser una secuencia de comandos de Python, Perl guión, script de shell, los programas de C o C ++.


Gráfico CGI

cgiarch


configuración del servidor web y el apoyo

Antes de realizar la programación CGI, asegúrese de que el servidor Web se ha configurado para soportar CGI y controlador CGI.

Apache soporta la configuración CGI:

Configurar el directorio CGI:

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

Todo servidor HTTP para ejecutar programas CGI se almacenan en un directorio preconfigurado. Este directorio se llama el directorio CGI, y por convención, se nombra directorio / var / www / cgi-bin.

archivo CGI extensión .cgi, Perl también puede utilizar la extensión .pl.

Por defecto, la configuración del servidor Linux corriendo directorio cgi-bin es / var / www.

Si desea especificar un directorio diferente para ejecutar scripts CGI, puede modificar el archivo de configuración httpd.conf de la siguiente manera:

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

Añada el sufijo .pl AddHandler, por lo que podemos acceder a la final del archivo script de Perl .pl:

AddHandler cgi-script .cgi .pl .py

El primer programa CGI

A continuación creamos un archivo test.cgi, el código es el siguiente:

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

A continuación, abra su navegador a http: //localhost/cgi-bin/test.cgi, los resultados de salida son los siguientes:

La salida de la primera línea del script "Content-type: text / html \ r \ n \ r \ n" se envía al navegador y decirle al navegador para visualizar el tipo de contenido "text / html".


cabecera HTTP

el contenido del archivo en test.cgi: parte de la cabecera HTTP es "Content-type text / html", que será enviado al tipo de contenido del navegador le dice a los archivos del navegador.

formato de la cabecera HTTP es el siguiente:

HTTP 字段名: 字段内容

Por ejemplo:

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

En la siguiente tabla se describe la información de los programas CGI de cabecera HTTP se utilizan a menudo:

cabeza descripción
Content-type: MIME entidad correspondiente a la solicitud de información. Por ejemplo: Content-type: text / html
Expira: Fecha fecha y tiempo de respuesta caducado
Localización: URL Para redirigir el destinatario de una solicitud no ubicación URL para completar la solicitud o la identificación de nuevos recursos
-Modificado: Fecha recurso solicitado fue modificada por última vez
Content-Length: N solicitud de Content-Length
Set-Cookie: String http configuración de cookies

Variables de entorno CGI

Todos los programas CGI han recibido las siguientes variables de entorno, que desempeñaron un papel importante en el programa CGI:

nombre de la variable descripción
CONTENT_TYPE Este valor indica que la variable de entorno para el tipo MIME de transferencia de información. En la actualidad, las variables de entorno son generalmente CONTENT_TYPE: urlencoded-x-www-formulario de solicitud /, dijo que los datos del formulario HTML.
CONTENT_LENGTH Si la información del servidor y el modo de transferencia de programa CGI es POST, aunque el entorno STDIN variables el número de bytes que se pueden leer datos válidos de la norma. Esta variable de entorno al leer los datos de entrada debe ser utilizado.
HTTP_COOKIE contenido de las cookies dentro del cliente.
HTTP_USER_AGENT Proporcionar información incluye el número de versión del navegador del cliente u otros datos de propiedad.
PATH_INFO El valor de esta variable de entorno indica el nombre del programa CGI inmediatamente después de la información de la ruta adicional. A menudo aparece como un programa argumento CGI.
QUERY_STRING Si la información del servidor y el modo de transferencia de información de programa CGI es GET, el valor de esta variable de entorno, incluso si se aprueba. Esta información es seguido por el nombre del programa CGI, tanto en el medio con un signo de interrogación "?" Separador.
REMOTE_ADDR El valor de esta variable de entorno es la dirección IP del cliente envía una petición, por ejemplo, el 192.168.1.67 anteriormente. Este valor está siempre presente. Y es la necesidad de proporcionar al cliente Web para el identificador único del servidor Web se puede utilizar en los programas CGI para distinguir entre diferentes cliente Web.
REMOTE_HOST El valor de esta variable de entorno contiene el nombre de host del cliente solicitante de CGI. Si no lo hace usted quiere comprobar, no es necesario definir esta variable de entorno.
REQUEST_METHOD Proporciona un método llamado guión. Para HTTP script / 1.0 protocolo sólo GET y POST significativa.
SCRIPT_FILENAME La ruta completa a los scripts CGI
SCRIPT_NAME El nombre de la secuencia de comandos CGI
NOMBRE_SERVIDOR Este es el nombre de host, alias o dirección IP de su servidor web.
SERVER_SOFTWARE El valor de esta variable de entorno contiene el nombre del programa CGI llamada y número de versión del servidor HTTP. Por ejemplo, el valor anterior de Apache / 2.2.14 (Unix)

Aquí es una simple salida de variables de entorno CGI script 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;

descargas

Si queremos lograr a través de las descargas de archivos CGI Perl, requiere un conjunto diferente de información de la cabecera de la siguiente manera:

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

Utilice el método GET de la transferencia de datos

GET método para enviar al usuario información codificada al servidor, la información de datos está contenida en la URL de la petición de la página de número dividido de la siguiente manera "?":

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
Peticiones GET sobre algunos de los otros comentarios:
  • GET solicitud puede ser almacenado en caché
  • solicitud GET permanece en el historial del navegador
  • Peticiones GET se pueden marcar
  • Peticiones GET no se deben utilizar cuando se trata de datos sensibles
  • Peticiones GET tienen restricciones de longitud
  • Peticiones GET sólo se deben usar para recuperar datos

Ejemplos de URL simple: Obtiene el método

El siguiente es un enlace simple, utilizando el método GET para enviar dos parámetros al programa de test.cgi:

/cgi-bin/test.cgi?name=本教程&url=http://www.w3big.com

Un archivo de código 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;

Compruebe su navegador, los resultados de salida son los siguientes:

Ejemplos de forma sencilla: GET método

La siguiente es una de dos enviar los datos al servidor utilizando el método GET a través de un formulario HTML, presentado el mismo documento test.cgi script del servidor, test.html código es el siguiente:

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

aplicación de navegador de los resultados es como sigue:


Utilizar el método POST para pasar datos

Utilizando el método POST para pasar los datos al servidor es más seguro y fiable, como alguna información confidencial, como contraseñas de los usuarios necesitan utilizar POST para transferir datos.

Lo siguiente también es test.cgi, sino que también puede manejar los datos del formulario POST enviados por el 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;

La siguiente es una de dos enviar los datos al servidor utilizando el método GET a través de un formulario HTML, presentado el mismo documento test.cgi script del servidor, test.html código es el siguiente:

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

aplicación de navegador de los resultados es como sigue:

programa CGI para pasar datos a través de la casilla de verificación

casilla de verificación utilizado para enviar uno o más datos de la opción, test.html código es el siguiente:

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

Un archivo de código 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;

aplicación de navegador de los resultados es como sigue:


la transferencia de datos a través de la radio programa CGI

Sólo en la radio transferir datos a un servidor, test.html código es el siguiente:

<!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 es el siguiente:

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

aplicación de navegador de los resultados es como sigue:


la transferencia de datos a través de área de texto programa CGI

pase Textarea varias filas de datos al servidor, test.html código es el siguiente:

<!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 es el siguiente:

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

aplicación de navegador de los resultados es como sigue:


programa CGI para pasar datos a través del desplegable

código de la caja desplegable HTML de la siguiente manera:

<!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 código de script de la siguiente manera:

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

aplicación de navegador de los resultados es como sigue:


CGI se utiliza Cookies

protocolo http en un gran inconveniente es erróneo juzgar la identidad de un usuario, que dan a los programadores una gran cantidad de inconvenientes, pero aparece la función de cookies compensaba esta deficiencia.

cookie que se accede a la secuencia de comandos mientras el cliente a través del navegador del cliente en el disco duro del cliente para escribir registros de datos, recuperar datos cuando un cliente visita la siguiente secuencia de comandos, a fin de lograr la función de determinar la identidad, galleta utiliza comúnmente en la verificación de identidad.

la sintaxis de la galleta

cookies HTTP se envía a través de la cabecera HTTP para lograr, tuvo que transferir archivos, sintáctica de cabecera Set-Cookie es el siguiente:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = nombre: para ajustar el valor de la cookie (nombre no puede ser utilizado "," y "," número), cuando hay varios valores de nombre ";" para separar, por ejemplo: nombre1 = nombre1, nombre2 = nombre2 ; nombre3 = nombre3.
  • expira = Fecha: Galleta de la fecha de caducidad en el formato: expira = "Wdy, DD HH Lu-AAAA: MM: SS"
  • path = camino: el camino trazado soporte para cookies, si la ruta es una ruta, la cookie para todos los archivos y subdirectorios de la entrada de directorio en vigor, por ejemplo: path = "/ cgi-bin /", si la ruta es un archivo, galleta se refiere a la entrada en vigor de este archivo, por ejemplo: path = "/ cgi-bin / cookie.cgi".
  • domain = Dominio: el nombre de dominio de la cookie es válida, por ejemplo: domain = "www.w3big.com"
  • asegurar: Si se da esta bandera, que la cookie sólo puede ser transmitido a través del servidor https protocolo SSL.
  • cookie se recibió mediante el establecimiento de variables de entorno HTTP_COOKIE logra, programas CGI pueden obtener información mediante la recuperación de la variable de galletas.

ajustes de cookies

Ajustes de cookies es muy simple, galleta se enviarán por separado en el encabezado HTTP. El ejemplo siguiente establece el ID de usuario, contraseña y expira en una 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 内容

Encuentra la galleta

Cookie de la página de recuperación de información es muy simple, en el CGI variables de entorno HTTP_COOKIE, el formato de almacenamiento es de la siguiente información de cookie se almacena:

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

La salida del ejemplo anterior es:

User ID = XYZ
Password = XYZ123

módulo de CGI

Perl CGI proporciona muchos módulo incorporado, utiliza los dos siguientes: