Introducción a los CGI



1.- Introducción.

CGI son las siglas de Common Gateway Interface, un mecanismo que permite ejecutar programas activados desde un browser en un servidor Web. Este mecanismo permite la programación de páginas interactivas.

Los scripts CGI pueden generar documentos HTML cuyo contenido varie dependiendo de los argumentos que se le pasen o de determinadas condiciones. De esta forma podemos hacer accesos a bases de datos, realizar compras, etc.

Al diseñar un CGI hay que crear la parte que el usuario ve, el programa y el resultado que se le presenta al usuario.


2.- Modo de trabajo de los CGI

  1. El browser llama a una URL que es un CGI.
  2. El servidor recibe la petición, detecta que la URL es un CGI y ejecuta el script.
  3. El script realiza unas acciones (las que se le han programado).
  4. El script formatea los resultados de forma que el browser pueda interpretarlos.
  5. El usuario ve el resultado en el browser.


3.- Configuración del servidor para permitir CGI

Para que un servidor pueda ejecutar CGI, hay que configurar adecuadamente el daemon.

En general, los scripts deben estar en un directorio concreto reservado para los mismos, de forma que si el URL indica un fichero en ese directorio, el servidor ve que es un programa y no una página HTML.

Si utilizamos el servidor del CERN, debemos editar el fichero httpd.conf, donde encontraremos una linea del tipo:

     Exec /cgi-bin/* /home/www/cgi-bin/*

Puede haber varias líneas de este tipo, indicando que en esos directorios se pueden colocar los CGI.
La segunda parte de la línea es el nombre a usar para llamar a los CGI en las URL. La tercera parte es el camino físico en el disco donde estará los CGI.

Si utilizamos el servidor de NCSA, en el fichero srm.conf debemos añadir una línea del tipo:

     ScriptAlias /cgi-bin/ /home/www/cgi-bin/


4.- Cabecera de los scripts

Lo primero que debe hacer el script es informar del tipo de salida que va a dar como resultado (HTML, GIF, etc).

El tipo de documento se especifica en una línea del tipo:

     Content-type: tipo_MIME
donde tipo_MIME puede ser:

Tras esta linea, hay que enviar otra en blanco (dos retornos de carro). Por ejemplo, en Perl:

     print "Content-type: text/html\n\n";
     ....


5.- Datos de salida

Una vez especificada la cabecera, hay que proporcionar el documento acorde al tipo especificado como cabecera. Los datos se envian al browser simplemente sacándolos por salida estándar.

Por ejemplo:

	#!/usr/bin/perl
	print "Content-type: text/plain\n\n";
	print "Mi primer CGI";
	
mostrará en la ventana del browser del cliente el texto que aparece en el segundo print.

Probar el ejemplo...

Es importante que los datos enviados al browser (sacados por salida estándar) sean compatibles con el formato especificado en la cabecera.

Por ejemplo, si indicamos que vamos a generar un fichero HTML, el browser interpretará correctamente los tags que incluyamos:

	#!/usr/bin/perl
	print "Content-type: text/html\n\n";
	print "<HTML>";
	print "<BODY>";
	print "<HR>";
	print "<H1>Segundo CGI...</H1>";
	print "<HR>";
	print "</BODY>";
	print "</HTML>";
	
Probar el ejemplo...


6.- Consejos para evitar y resolver problemas

Cuando ejecutemos un CGI a través de un browser, si el CGI tiene algún error de programación, el únco error que obtendremos será algo del tipo:

	Internal Server Error
	
	The server encountered an internal error or 
	misconfiguration and was unable to complete your request.
	
	Please contact the server administrator, [email protected]
	and inform them of the time the error occurred, 
	and anything you might have done that may have caused the error.
	
lo cual no es muy útil a la hora de detectar los errores o depurar el programa.

Es conveniente (que no obligatorio) hacer uso de sentencias print cortas y claras, terminándolas con retornos de carro, para que el código HTML generado sea claro y fácil de depurar.

De esta forma, y antes de probar un script a través del browser, lo que haremos será ejecutarlo desde la línea de órdenes (shell), con lo cual, si hay errores, nos saldrá la línea/s donde los hay, y si todo está bien, nos imprimirá el código HTML que formaría la página a visualizar.

Por otro lado, si el código generado es fácil de seguir, nos será más fácil después ver porqué los elementos y la información generada para visualizar en el browser cliente no aparece como deseamos (si es que aparece mal).


7.- Ejemplos

Hora actual en formato texto

Se trata de un programa que al ser ejecutado muestra la hora actual en formato text/plain:
	#!/usr/bin/perl
	
	# parte activa del programa
	($s,$m,$h, @resto) = localtime(time);
	
	# composicion del documento a mostrar
	print "Content-type: text/plain\n\n";
	print "Hora actual: $h:$m:$s ";
	
Probar el ejemplo...

Procesado de las variables de entorno

El siguiente ejemplo muestra como visualizar todas las variables de entorno que se le pasan a un CGI en el array asociativo %ENV al ser llamado.
	#!/usr/bin/perl
	# composicion del documento a mostrar
	print "Content-type: text/html\n\n";
	print <<escribiendo;
	<html>
	<body>
	escribiendo;
	
	foreach $clave (keys(%ENV)) {
		print "$clave = $ENV{$clave} <BR>\n";
	}
	
	print "</body></html>\n";
	
Probar el ejemplo...

Pasarle valores a los CGIs al llamarlos

Hay dos formas de conseguir esto: como argumentos de la misma forma que en la llamada a programas en Perl desde la línea de órdenes (metodo GET) o como ya se verá más adelante, con otro método más potente (POST).

El ejemplo que pondremos aqui simplemente es llamado y cuenta el número de argumentos pasados y los muestra si ha habido alguno:

	#!/usr/bin/perl

	# composicion del documento a mostrar
	print "Content-type: text/plain\n\n";

	if( $#ARGV < 0 ) {
	  print "NO hay argumentos \n";
	}else{
	  print "SI hay argumentos (del 0 al $#ARGV) \n";
	  for($i=0; $i <= $#ARGV ;$i++){
	    print "$i   $ARGV[$i] \n";
	  }
	}
	
Probar el ejemplo...

Hora y fecha actuales en formato HTML

Ejercicio
Se trata ahora de utilizar otro formato (HTML) para hacer lo mismo que el primer ejemplo visto, solo que ahora también pintaremos la fecha.

Contador de visitas

Ejercicio
Se trata de hacer un contador de accesos a una página que guarde en un fichero de texto la cuenta de accesos que se han hecho hasta la fecha, lea el contenido, lo incremente y vuelva a guardar la cuenta actualizada antes de "crear" página a mostrar en el navegador. Esta idea podría usarse para usarlo en un frame junto con un menú mientras que en otro se muestra la página. Para devolver una imagen GIF o JPEG (como se suele hacer), habría que crear y devolver la imagen en tiempo real especificando que el tipo mime a devolver es una imagen de cierto tipo.


Pedro Angel Castillo Valdivieso: [email protected]
Equipo GeNeura
Departamento de Arquitectura y Tecnología de los Computadores
Universidad de Granada
tlf: +34-58-243163
fax: +34-58-243230
Hosted by www.Geocities.ws

1