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
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=value2Peticiones 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: