Versin 2.4 del Servidor HTTP Apache
Idiomas disponibles: ko
Mdulos Relacionados | Directivas Relacionadas |
---|---|
CGI (Common Gateway Interface) es un mtodo por el cual un servidor web puede interactuar con programas externos de generacin de contenido, a ellos nos referimos comnmente como programas CGI o scripts CGI. Es el mtodo ms comn y sencillo de mostrar contenido dinmico en su sitio web. Este documento es una introduccin para configurar CGI en su servidor web Apache, y de iniciacin para escribir programas CGI.
Para conseguir que sus programas CGI funcionen correctamente, deber configurar Apache para que permita la ejecucin de CGI. Hay distintas formas de hacerlo.
apache2.conf
tiene que asegurarse de que la directiva Loodule
no ha sido comentada. Una directiva configurada correctamente sera as:
Loodule cgid_module modules/mod_cgid.soEn Windows, o si usa un mpm que no es multihilo, como prefork, una directiva configurada correctamente podra definirse as:
Loodule cgi_module modules/mod_cgi.so
La directiva ScriptAlias
indica a Apache que un directorio se ha configurado especficamente para programas CGI. Apache asumir que cada fichero en este directorio es un programa CGI, e intentar ejecutarlos cuando un cliente solicita este recurso.
La directiva ScriptAlias
se puede definir as:
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
El ejemplo que se muestra es de un archivo de configuracin apache2.conf
por defecto si usted instal Apache en la ubicacin por defecto. La directiva DocumentRoot
. La diferencia entre Alias
y ScriptAlias
es que en ScriptAlias
cualquier elemento debajo de ese prefijo de URL ser considerado un programa CGI. As, el ejemplo de ms arriba le indica a Apache que cualquier solicitud para un recurso que comience con /cgi-bin/
debera servirse desde el directorio /usr/local/apache2/cgi-bin/
, y debera tratarse como un programa CGI.
Por ejemplo, si se solicita la URL http://www.example.com/cgi-bin/test.pl
, Apache intentar ejecutar el archivo /usr/local/apache2/cgi-bin/test.pl
y dar el resultado. Por supuesto el archivo debe existir y ser ejecutable, y dar el resultado de una manera especfica o Apache devolver un mensaje de error.
Los programas CGI habitualmente se restringen a los directorios de Dir
. Si quieren tener sus propios programas CGI, pero no tienen al directorio principal cgi-bin
, necesitarn ser capaces de ejecutar sus scripts CGI en algn otro sitio.
Hay dos pasos a seguir para permitir la ejecucin CGI en directorios seleccionados de manera arbitraria. Primero, el handler cgi-script
debe estar activado usando la directiva Options
.
Puede usar la directiva Options
, en el archivo de configuracin principal para especificar que se permite la ejecucin de CGI en un directorio en particular:
<Directory "/usr/local/apache2/htdocs/somedir"> Options +ExecCGI </Directory>
Esta directiva de aqu arriba le indica a Apache que debe permitir la ejecucin de archivos CGI. Tambin necesitar indicarle al servidor que los archivos son archivos CGI. La directiva AddHandler
le indica al servidor que debe tratar a todos los archivos con la extensin cgi
o pl
como programas CGI:
AddHandler cgi-script .cgi .pl
El tutorial .htaccess
ensea como activar programas CGI si no tienes a apache2.conf
.
Para permitir la ejecucin de programas CGI para cualquier archivo que acabe en .cgi
en directorios de , puedes usar la siguiente configuracin:
<Directory "/home/*/public_html"> Options +ExecCGI AddHandler cgi-script .cgi </Directory>
Si quiere designar un subdirectorio cgi-bin
dentro de un directorio de en el que todos los ficheros sern tratados como un programa CGI, puede usar lo siguiente:
<Directory "/home/*/public_html/cgi-bin"> Options ExecCGI SetHandler cgi-script </Directory>
Hay dos diferencias principales entre programacin ``regular'' y programacin en CGI.
Primera, el resultado al completo de tu programa CGI debe estar precedido de una cabecera MIME-type. Esta cabecera HTTP le indica al cliente que tipo de contenido est recibiendo. La mayor parte de las veces, sto ser algo como:
Content-type: text/html
Segunda, el resultado debe estar en formato HTML, o cualquier otro formato que su navegador sea capaz de mostrar. La mayor parte de las veces, ser HTML, pero otras escribir un programa CGI que devuelve una imagen gif, u otro contenido no-HTML.
Aparte de estas dos cosas, escribir un programa en CGI se parecer bastante a cualquier otro programa que vaya a escribir.
A continuacin podr ver un ejemplo de programa CGI que muestra una lnea de texto en su navegador. Escriba lo siguiente, gurdelo en un archivo con el nombre first.pl
, y pngalo en su directorio cgi-bin
.
#!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hola, Mundo.";
Incluso si Perl no le resulta familiar, podr ver lo que est ocurriendo aqu. La primera lnea le dice a Apache (o a cualquier shell en la que se est ejecutando) que este programa puede ejecutarse con el intrprete en la ubicacin /usr/bin/perl
. La segunda lnea imprime la declaracin de Content-Type que mencionamos antes, seguida de dos pares de retornos de carro. Esto pone una lnea en blanco despus de la cabecera para indicar el final de las cabeceras HTTP, y el comienzo del cuerpo del contenido. La tercera imprime la cadena de caracteres "Hola, Mundo.". Y ese es el final del programa.
Si lo abre con su navegador favorito y le dice que solicite la direccin
http://www.example.com/cgi-bin/first.pl
o donde quiera que pusiera el archivo, ver una lnea Hola, Mundo.
aparecern la ventana del navegador. No es muy emocionante, pero una vez que consiga que funcione podr hacer lo mismo con casi cualquier programa.
Hay 4 cosas bsicas que puede llegar a ver en su navegador cuando intenta acceder a un programa CGI desde la web:
Content-Type
en su programa CGI.
Recuerde que el servidor no se ejecuta con su . Es decir, cuando el servidor arranca, est funcionando con un sin privilegios, generalmente el nobody
, o www-data
, as que necesitar permisos extra para ejecutar los archivos de los que usted es dueo. Generalmente, el mtodo para dar permisos suficientes para que se pueda ejecutar con nobody
es dar permisos de ejecucin a todo el mundo en el fichero:
chmod a+x first.pl
Adems, si su programa lee desde o escribe a cualquier otro/s archivo/s, esos archivos necesitarn tener los permisos correctos para permitir esas acciones.
Cuando ejecuta un programa desde la lnea de comandos, usted tiene cierta informacin que se le pasa a la shell sin que usted se percate de ello. Por ejemplo, usted tiene un PATH
, que le indica a la shell dnde debe buscar archivos a los que usted hace referencia.
Cuando un programa se ejecuta a travs del servidor web como un programa CGI, puede que no tenga el mismo PATH
. Cualquier programa que invoque desde su programa CGI (como por ejemplo sendmail
) necesitar que se le indique la ruta absoluta, as la shell puede encontrarlos cuando intenta ejecutar su programa CGI.
Una manifestacin comn de esto es la ruta del intrprete del script (a menudo perl
) indicado en la primera lnea de su programa CGI, que parecer algo como:
#!/usr/bin/perl
Asegrese de que ste es de hecho el path de su intrprete.
Si su programa CGI depende de variables de entorno no estndar, necesitar asegurarse de que Apache pasa esas variables.
Cuando no encuentra ciertas cabeceras HTTP del entorno, asegrese de que estn formateadas segn el RFC 2616, seccin 4.2: Nombres de Cabeceras deben empezar con una letra, seguida solo de letras, nmeros o guin. Cualquier cabecera que no cumpla esta regla ser ignorada de manera silenciosa.
La mayor parte de las veces cuando un programa CGI falla, es por un problema en el programa mismo. Esto ocurre generalmente cuando se maneja bien con "esto del CGI", y ya no comete los dos errores mencionados ms arriba. Lo primero que hay que hacer es asegurarse de que su programa se ejecuta correctamente en lnea de comandos antes de probarlo a travs del servidor web. Por ejemplo, intente:
cd /usr/local/apache2/cgi-bin
./first.pl
(No llame al intrprete de perl
. La consola y Apache tienen que poder encontrar el intrprete usando lnea lnea de informacin en la primera lnea del script.)
Lo primero que debe ver escrito por su programa es un conjunto de cabeceras HTTP, incluyendo el Content-Type
, seguido de una lnea en blanco. Si ve alguna otra cosa, Apache devolver el error Premature end of script headers
si intenta lanzar el script en el servidor web. Vea Escribiendo un programa CGI ms arriba para ms detalle.
El log de errores es su amigo. Cualquier cosa que vaya mal generar un mensaje en el log de errores. Debera mirar siempre ah primero. Si el lugar donde est alojando su sitio web no permite que acceda al log de errores, probablemente debera alojarlo en otro sitio. Aprenda a leer el log de errores y se dar cuenta de que enseguida averiguar el motivo del error y lo solucionar rpidamente.
El programa de soporte suexec permite que programas CGI se ejecuten con permisos de distintos, dependiendo del virtualhost o el directorio home donde se encuentren. Suexec tiene una comprobacin de permisos muy estricta, y cualquier fallo en esa comprobacin dar como resultado un error con el mensaje Premature end of script headers
.
Para comprobar si est usando Suexec, ejecute apache2ctl -V
y compruebe la ubicacin de SUEXEC_BIN
. Si Apache encuentra un binario suexec
al arrancar, suexec se activar.
A menos que comprenda suxec perfectamente, no debera usarlo. Para desactivar suexec, basta con eliminar el binario suexec todava quiere usarlo, entonces ejecute
suexec -V
para encontrar la ubicacin del fichero log de suexec, y use ese log para encontrar que poltica no est cumpliendo.
En cuanto tenga conocimiento avanzado de programacin CGI, le ser til comprender ms de lo que ocurre entre bastidores. Especficamente, cmo el navegador y el servidor se comunican el uno con el otro. Porque aunque est muy bien escribir un programa que diga "Hola, Mundo.", no tiene una gran utilidad.
Las variables de entorno son valores que estn ah cuando usa el ordenador. Son cosas tiles como el path (donde su ordenador busca el archivo especfico que se lanza cuando usted escribe un comando), su nombre de , el tipo de terminal que usa, etc. Para una lista completa de la variables de entorno normales que se se usan en su da a da escriba env
en la lnea de comandos.
Durante la transaccin CGI, el servidor y el navegador tambin configuran variables de entorno, y as pueden comunicarse entre ellos. Cosas como el tipo de navegador (Netscape, IE, Lynx), el tipo de servidor (Apache, IIS, WebSite), el nombre del programa CGI que se est ejecutando, etc.
Estas variables estn disponibles para el programador de CGI, y son la mitad de la historia de la comunicacin cliente-servidor. La lista completa de las variables necesarias se encuentra en el RFC de Common Gateway Interface.
Este sencillo programa CGI en Perl mostrar todas las variables de entorno que se estn pasando entre el cliente y el navegador. Dos programas similares estn incluidos en el directorio cgi-bin
de la distribucin de Apache. Tenga en cuenta que algunas variables son necesarias mientras que otras son opcionales, as que es posible que vea algunas variables que no estn en la lista oficial. Adicionalmente, Apache aporta distintas maneras diferentes para que pueda aadir sus variables de entorno a las bsicas que se proveen por defecto.
#!/usr/bin/perl use strict; use warnings; print "Content-type: text/html\n\n"; foreach my $key (keys %ENV) { print "$key --> $ENV{$key}<br>"; }
Otra comunicacin entre el servidor y el cliente ocurre en la entrada estndar (STDIN
) y la salida estndar (STDOUT
). En el contexto normal de cada da, STDIN
es la entrada con el teclado, o un fichero que se le da a un programa para que acte sobre l, y STDOUT
generalmente es la consola o la pantalla.
Cuando hace POST
con un formulario de web a un programa CGI, los datos en ese formulario se empaquetan en un formato especial que se entrega a su programa CGI en el STDIN
. Entonces el programa puede procesar la informacin como si le llegara desde el teclado, o desde un fichero.
El "formato especial" es muy sencillo. Un nombre de campo y su valor se asocian juntos con el signo igual (=), y pares de valores se asocian juntos con el ampersand et en espaol (&). Caracteres inconvenientes como los espacios, ampersands y signos de igual, se convierten en su equivalente hexadecimal para no impidan el funcionamiento correcto del programa. La cadena de datos al completo ser algo como:
name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey
A veces tendr este tipo de cadena de caracteres al final de una URL. Cuando esto ocurre, el servidor pone esa cadena en una variable de entorno que se llama QUERY_STRING
. Esto se llama solicitud GET
. Su formulario HTML especifica si se usa un GET
o un POST
para entregar la informacin, configurando el atributo METHOD
en la etiqueta FORM
.
Su programa es el responsable de convertir esa cadena de caracteres en informacin til. Afortunadamente, hay libreras y mdulos disponibles que ayudan a procesar la informacin, as como a gestionar los distintos aspectos de su programa CGI.
Cuando escribe programas CGI, debera considerar usar una librera de cdigo, o mdulo, para hacer todo el trabajo ms arduo por usted. Esto lleva a tener menos errores y un desarrollo de cdigo ms rpido.
Si est escribiendo un programa CGI en Perl, existen mdulos disponibles en AN. El mdulo ms conocido para este propsito es CGI.pm
. Quizs quiera considerar CGI::Lite
, que implementa una funcionalidad mnima, que es todo lo que se necesita en la mayora de los programas.
Si est escribiendo programas CGI en C, hay varidad de opciones. Una de estas es la librera CGIC
, de http://www.boutell.com/cgic/.
La especificacin actual de CGI est disponible en el RFC de Common Gateway Interface.
Cuando enve una pregunta sobre un problema de CGI, o bien a una lista de correo, o a un grupo de noticias, asegrese de que facilita suficiente informacin de lo que ha ocurrido, de lo que espera que ocurra, y de lo que est ocurriendo en su lugar que es diferente, el servidor que est ejecutando, en qu lenguaje CGI est hecho su programa, y si es posible, el cdigo que falla. Esto har encontrar el problema mucho ms fcil.
Tenga en cuenta que las preguntas sobre problemas CGI nunca deberan enviarse a la base de datos de bugs de bugs de Apache a menos que est seguro de haber encontrado un problema en el cdigo fuente de Apache.
Idiomas disponibles: ko