<-
Apache > Servidor HTTP > Documentación > Versión 2.4 > How-To / Tutoriales

Tutorial de Apache: Contenido Dinámico con CGI

Idiomas disponibles:  en  |  es  |  fr  |  ja  |  ko 

Support Apache!

Consulte también

top

Introducción

CGI (Common Gateway Interface) es un método por el cual un servidor web puede interactuar con programas externos de generación de contenido, a ellos nos referimos comúnmente como programas CGI o scripts CGI. Es el método más común y sencillo de mostrar contenido dinámico en su sitio web. Este documento es una introducción para configurar CGI en su servidor web Apache, y de iniciación para escribir programas CGI.

top

Configurando Apache para permitir CGI

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

Nota: Si Apache ha sido compilado con soporte de módulos compartidos, necesitará que el módulo de CGI esté cargado; en su apache2.conf tiene que asegurarse de que la directiva LoadModule no ha sido comentada. Una directiva configurada correctamente sería así:
LoadModule cgid_module modules/mod_cgid.so
En Windows, o si usa un mpm que no es multihilo, como prefork, una directiva configurada correctamente podría definirse así:
LoadModule cgi_module modules/mod_cgi.so

ScriptAlias

La directiva ScriptAlias indica a Apache que un directorio se ha configurado específicamente 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 configuración apache2.conf por defecto si usted instaló Apache en la ubicación por defecto. La directiva ScriptAlias es muy parecida a la directiva Alias, ésta define un prefijo de URL que se enlaza a un directorio en particular. Alias y ScriptAlias se usan generalmente para directorios que se encuentran fuera del directorio 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 más arriba le indica a Apache que cualquier solicitud para un recurso que comience con /cgi-bin/ debería servirse desde el directorio /usr/local/apache2/cgi-bin/, y debería 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 específica o Apache devolverá un mensaje de error.

CGI fuera de directorios ScriptAlias

Los programas CGI habitualmente se restringen a los directorios de ScriptAlias por razones de seguridad. De esta manera, los administradores pueden controlar de una manera más segura quien puede ejecutar programas CGI. Aun así, si no se toman suficientes precauciones, no hay ninguna razón por la que programas CGI no se puedan ejecutar desde directorios seleccionados de manera arbitraria. Por ejemplo, quizás quiera permitir que usuarios del sistema tengan contenido web en sus directorios home con la directiva UserDir. Si quieren tener sus propios programas CGI, pero no tienen acceso al directorio principal cgi-bin, necesitarán ser capaces de ejecutar sus scripts CGI en algún otro sitio.

Hay dos pasos a seguir para permitir la ejecución CGI en directorios seleccionados de manera arbitraria. Primero, el handler cgi-script debe estar activado usando la directiva AddHandler o la directiva SetHandler. Segundo, el parámetro ExecCGI debe estar definido en la directiva Options.

Usando Options de manera explícita para permitir ejecución de CGI

Puede usar la directiva Options, en el archivo de configuración principal para especificar que se permite la ejecución 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 ejecución de archivos CGI. También 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 extensión cgi o pl como programas CGI:

AddHandler cgi-script .cgi .pl

Ficheros .htaccess

El tutorial .htaccess enseña como activar programas CGI si no tienes acceso a apache2.conf.

Directorios de Usuario

Para permitir la ejecución de programas CGI para cualquier archivo que acabe en .cgi en directorios de usuario, puedes usar la siguiente configuración:

<Directory "/home/*/public_html">
    Options +ExecCGI
    AddHandler cgi-script .cgi
</Directory>

Si quiere designar un subdirectorio cgi-bin dentro de un directorio de usuario en el que todos los ficheros serán 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

Hay dos diferencias principales entre programación ``regular'' y programación 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

A continuación podrá ver un ejemplo de programa CGI que muestra una línea de texto en su navegador. Escriba lo siguiente, guárdelo en un archivo con el nombre first.pl, y póngalo 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 línea le dice a Apache (o a cualquier shell en la que se esté ejecutando) que este programa puede ejecutarse con el intérprete en la ubicación /usr/bin/perl. La segunda línea imprime la declaración de Content-Type que mencionamos antes, seguida de dos pares de retornos de carro. Esto pone una línea en blanco después 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 dirección

http://www.example.com/cgi-bin/first.pl

o donde quiera que pusiera el archivo, verá una línea Hola, Mundo. aparecerán 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 todavía no funciona!

Hay 4 cosas básicas 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, asegúrese de que tiene especificado correctamente el Content-Type en su programa CGI.
El código 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 sección 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 Log de Errores de Apache y la sección de más abajo de 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 acompañado de otro mensaje de error generado por su programa CGI. En este caso, querrá comprobar cada una de las secciones de más adelante para ver qué impide que su programa CGI genere las cabeceras HTTP adecuadas.

Permisos de Fichero

Recuerde que el servidor no se ejecuta con su usuario. Es decir, cuando el servidor arranca, está funcionando con un usuario sin privilegios, generalmente el usuario nobody,