<-
Apache > Servidor HTTP > Documentacin > How-To / Tutoriales

Tutorial de Apache: Contenido Dinmico con CGI 2y6u6u

Idiomas disponibles: ko

Esta traduccin podra estar obsoleta. Consulte la versin en ingls de la documentacin para comprobar si se han producido cambios recientemente.
 Apache!

Consulte tambin 382u41

top

Introduccin 4w406i

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.

top

Configurando Apache para permitir CGI 601l6j

Para conseguir que sus programas CGI funcionen correctamente, deber configurar Apache para que permita la ejecucin de CGI. Hay distintas formas de hacerlo.

Nota: Si Apache ha sido compilado con soporte de mdulos compartidos, necesitar que el mdulo de CGI est cargado; en su 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.so
En 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

ScriptAlias 6254h

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.

CGI fuera de directorios ScriptAlias 5r106k

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.

Usando Options de manera explcita para permitir ejecucin de CGI 6b6v4u

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

Ficheros .htaccess 233z54

El tutorial .htaccess ensea como activar programas CGI si no tienes a apache2.conf.

Directorios de 3i123b

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

Escribiendo un programa CGI 4a5kw

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.

Su primer programa CGI 5b365q

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.

top

Pero todava no funciona! 5r2z26

Hay 4 cosas bsicas que puede llegar a ver en su navegador cuando intenta acceder a un programa CGI desde la web:

El resultado del programa CGI
Genial! Esto indica que todo funcion correctamente. Si el resultado es correcto, pero el navegador no lo procesa correctamente, asegrese de que tiene especificado correctamente el Content-Type en su programa CGI.
El cdigo fuente de su programa CGI o un mensaje del tipo "POST Method Not Allowed".
Eso significa que no ha configurado Apache de manera apropiada para interpretar su programa CGI. Relea la seccin de Configurando Apache e intente encontrar qu le falta.
Un mensaje que empieza con "Forbidden"
Eso significa que hay un problema de permisos. Compruebe el Permisos de Fichero.
Un mensaje indicando "Internal Server Error"
Si comprueba el Log de errores de Apache, probablemente encontrar que indica "Premature end of script headers", posiblemente acompaado de otro mensaje de error generado por su programa CGI. En este caso, querr comprobar cada una de las secciones de ms adelante para ver qu impide que su programa CGI genere las cabeceras HTTP adecuadas.

Permisos de Fichero 2o6r6d

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.

Informacin de Ruta y Entorno 2jk2

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.

Cuando edita scripts CGI en Windows, los caracteres de retorno de carro podran aadirse a la lnea donde se especifica el intrprete. Asegrese de que los archivos se transfieren al servidor en modo ASCII. Fallar en esto puede acabar con avisos del tipo "Command not found" del Sistema Operativo, debido a que ste no reconoce los caracteres de final de lnea interpretados como parte del nombre de fichero del intrprete.

Faltan Variables de Entorno 1b4c2a

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.

Errores de Programa 592837

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.

Log de Errores m2r13

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.

Suexec 2y6z6g

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.

top

Qu ocurre entre bastidores? 481z5l

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.

Variables de Entorno 3m1k60

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

STDIN y STDOUT 595fq

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.

top

Mdulos/libreras CGI f5s5w

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/.

top

Para ms informacin 5g5p38

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

top

Comentarios 3f6r1x

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our s if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.