|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"><head>
|
|
Packit |
90a5c9 |
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
Packit |
90a5c9 |
This file is generated from xml source: DO NOT EDIT
|
|
Packit |
90a5c9 |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
Packit |
90a5c9 |
-->
|
|
Packit |
90a5c9 |
<title>Tutorial de Apache: Contenido Dinámico con CGI - Servidor HTTP Apache Versión 2.4</title>
|
|
Packit |
90a5c9 |
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
|
|
Packit |
90a5c9 |
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
|
|
Packit |
90a5c9 |
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
|
|
Packit |
90a5c9 |
<script src="../style/scripts/prettify.min.js" type="text/javascript">
|
|
Packit |
90a5c9 |
</script>
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
<link href="../images/favicon.ico" rel="shortcut icon" /></head>
|
|
Packit |
90a5c9 |
<body id="manual-page">
|
|
Packit |
90a5c9 |
Módulos | Directivas | Preguntas Frecuentes | Glosario | Mapa del sitio web
|
|
Packit |
90a5c9 |
Versión 2.4 del Servidor HTTP Apache
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Apache > Servidor HTTP > Documentación > Versión 2.4 > How-To / TutorialesTutorial de Apache: Contenido Dinámico con CGI
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Idiomas disponibles: en |
|
|
Packit |
90a5c9 |
es |
|
|
Packit |
90a5c9 |
fr |
|
|
Packit |
90a5c9 |
ja |
|
|
Packit |
90a5c9 |
ko
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Configurando Apache para permitir CGI
|
|
Packit |
90a5c9 |
Escribiendo un programa CGI
|
|
Packit |
90a5c9 |
¡Pero todavía no funciona!
|
|
Packit |
90a5c9 |
¿Qué ocurre entre bastidores?
|
|
Packit |
90a5c9 |
Módulos/librerías CGI
|
|
Packit |
90a5c9 |
Para más información
|
|
Packit |
90a5c9 |
Consulte también
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
CGI (Common Gateway Interface) es un método por el cual
|
|
Packit |
90a5c9 |
un servidor web puede interactuar con programas externos de
|
|
Packit |
90a5c9 |
generación de contenido, a ellos nos referimos comúnmente como
|
|
Packit |
90a5c9 |
programas CGI o scripts CGI. Es el método más común y sencillo de
|
|
Packit |
90a5c9 |
mostrar contenido dinámico en su sitio web. Este documento es una
|
|
Packit |
90a5c9 |
introducción para configurar CGI en su servidor web Apache, y de
|
|
Packit |
90a5c9 |
iniciación para escribir programas CGI.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Para conseguir que sus programas CGI funcionen correctamente,
|
|
Packit |
90a5c9 |
deberá configurar Apache para que permita la ejecución de CGI. Hay
|
|
Packit |
90a5c9 |
distintas formas de hacerlo.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Nota: Si Apache ha sido compilado con soporte
|
|
Packit |
90a5c9 |
de módulos compartidos, necesitará que el módulo de CGI esté cargado;
|
|
Packit |
90a5c9 |
en su httpd.conf tiene que asegurarse de que la directiva
|
|
Packit |
90a5c9 |
LoadModule
|
|
Packit |
90a5c9 |
no ha sido comentada. Una directiva configurada correctamente sería así:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
LoadModule cgid_module modules/mod_cgid.so
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
En Windows, o si usa un mpm que no es multihilo, como prefork, una
|
|
Packit |
90a5c9 |
directiva configurada correctamente podría definirse así:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
LoadModule cgi_module modules/mod_cgi.so
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
La directiva
|
|
Packit |
90a5c9 |
ScriptAlias
|
|
Packit |
90a5c9 |
indica a Apache que un directorio se ha configurado específicamente
|
|
Packit |
90a5c9 |
para programas CGI. Apache asumirá que cada fichero en este
|
|
Packit |
90a5c9 |
directorio es un programa CGI, e intentará ejecutarlos cuando un
|
|
Packit |
90a5c9 |
cliente solicita este recurso.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
La directiva
|
|
Packit |
90a5c9 |
ScriptAlias se puede
|
|
Packit |
90a5c9 |
definir así:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
El ejemplo que se muestra es de un archivo de configuración
|
|
Packit |
90a5c9 |
httpd.conf por defecto si usted instaló Apache
|
|
Packit |
90a5c9 |
en la ubicación por defecto. La directiva
|
|
Packit |
90a5c9 |
ScriptAlias es muy
|
|
Packit |
90a5c9 |
parecida a la directiva Alias ,
|
|
Packit |
90a5c9 |
ésta define un prefijo de URL que se enlaza a un directorio
|
|
Packit |
90a5c9 |
en particular. Alias y
|
|
Packit |
90a5c9 |
ScriptAlias se usan generalmente para
|
|
Packit |
90a5c9 |
directorios que se encuentran fuera del directorio
|
|
Packit |
90a5c9 |
DocumentRoot . La diferencia
|
|
Packit |
90a5c9 |
entre Alias y ScriptAlias
|
|
Packit |
90a5c9 |
es que en ScriptAlias cualquier elemento
|
|
Packit |
90a5c9 |
debajo de ese prefijo de URL será considerado un programa CGI. Así,
|
|
Packit |
90a5c9 |
el ejemplo de más arriba le indica a Apache que
|
|
Packit |
90a5c9 |
cualquier solicitud para un recurso que comience con
|
|
Packit |
90a5c9 |
/cgi-bin/ debería servirse desde el directorio
|
|
Packit |
90a5c9 |
/usr/local/apache2/cgi-bin/ , y debería tratarse como un
|
|
Packit |
90a5c9 |
programa CGI.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Por ejemplo, si se solicita la URL
|
|
Packit |
90a5c9 |
http://www.example.com/cgi-bin/test.pl ,
|
|
Packit |
90a5c9 |
Apache intentará ejecutar el archivo
|
|
Packit |
90a5c9 |
/usr/local/apache2/cgi-bin/test.pl y dar
|
|
Packit |
90a5c9 |
el resultado. Por supuesto el archivo debe existir y ser ejecutable,
|
|
Packit |
90a5c9 |
y dar el resultado de una manera específica o Apache devolverá
|
|
Packit |
90a5c9 |
un mensaje de error.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Los programas CGI habitualmente se restringen a los directorios de
|
|
Packit |
90a5c9 |
ScriptAlias por razones de
|
|
Packit |
90a5c9 |
seguridad. De esta manera, los administradores pueden controlar de una
|
|
Packit |
90a5c9 |
manera más segura quien puede ejecutar programas CGI. Aun así, si no
|
|
Packit |
90a5c9 |
se toman suficientes precauciones, no hay ninguna razón por la que
|
|
Packit |
90a5c9 |
programas CGI no se puedan ejecutar desde directorios seleccionados de
|
|
Packit |
90a5c9 |
manera arbitraria. Por ejemplo, quizás quiera permitir que usuarios del
|
|
Packit |
90a5c9 |
sistema tengan contenido web en sus directorios home con la directiva
|
|
Packit |
90a5c9 |
UserDir . Si quieren
|
|
Packit |
90a5c9 |
tener sus propios programas CGI, pero no tienen acceso al directorio
|
|
Packit |
90a5c9 |
principal cgi-bin , necesitarán ser capaces de
|
|
Packit |
90a5c9 |
ejecutar sus scripts CGI en algún otro sitio.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Hay dos pasos a seguir para permitir la ejecución CGI en directorios
|
|
Packit |
90a5c9 |
seleccionados de manera arbitraria. Primero, el handler
|
|
Packit |
90a5c9 |
cgi-script debe estar activado usando la directiva
|
|
Packit |
90a5c9 |
AddHandler o la directiva
|
|
Packit |
90a5c9 |
SetHandler . Segundo, el parámetro
|
|
Packit |
90a5c9 |
ExecCGI debe estar definido en la directiva
|
|
Packit |
90a5c9 |
Options .
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
CGI
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Puede usar la directiva
|
|
Packit |
90a5c9 |
Options , en el archivo de
|
|
Packit |
90a5c9 |
configuración principal para especificar que se permite la ejecución
|
|
Packit |
90a5c9 |
de CGI en un directorio en particular:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
<Directory "/usr/local/apache2/htdocs/somedir">
|
|
Packit |
90a5c9 |
Options +ExecCGI
|
|
Packit |
90a5c9 |
</Directory>
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Esta directiva de aquí arriba le indica a Apache que debe
|
|
Packit |
90a5c9 |
permitir la ejecución de archivos CGI. También necesitará indicarle
|
|
Packit |
90a5c9 |
al servidor que los archivos son archivos CGI. La directiva
|
|
Packit |
90a5c9 |
AddHandler le indica al
|
|
Packit |
90a5c9 |
servidor que debe tratar a todos los archivos con la extensión
|
|
Packit |
90a5c9 |
cgi o pl como programas CGI:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
AddHandler cgi-script .cgi .pl
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
El tutorial .htaccess
|
|
Packit |
90a5c9 |
enseña como activar programas CGI si no tienes acceso a
|
|
Packit |
90a5c9 |
httpd.conf .
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Para permitir la ejecución de programas CGI para cualquier
|
|
Packit |
90a5c9 |
archivo que acabe en .cgi en directorios de usuario,
|
|
Packit |
90a5c9 |
puedes usar la siguiente configuración:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
<Directory "/home/*/public_html">
|
|
Packit |
90a5c9 |
Options +ExecCGI
|
|
Packit |
90a5c9 |
AddHandler cgi-script .cgi
|
|
Packit |
90a5c9 |
</Directory>
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Si quiere designar un subdirectorio cgi-bin dentro
|
|
Packit |
90a5c9 |
de un directorio de usuario en el que todos los ficheros serán
|
|
Packit |
90a5c9 |
tratados como un programa CGI, puede usar lo siguiente:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
<Directory "/home/*/public_html/cgi-bin">
|
|
Packit |
90a5c9 |
Options ExecCGI
|
|
Packit |
90a5c9 |
SetHandler cgi-script
|
|
Packit |
90a5c9 |
</Directory>
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Hay dos diferencias principales entre programación ``regular'' y
|
|
Packit |
90a5c9 |
programación en CGI.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Primera, el resultado al completo de tu programa CGI debe estar
|
|
Packit |
90a5c9 |
precedido de una cabecera MIME-type. Esta
|
|
Packit |
90a5c9 |
cabecera HTTP le indica al cliente que tipo de contenido está
|
|
Packit |
90a5c9 |
recibiendo. La mayor parte de las veces, ésto será algo como:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Content-type: text/html
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Segunda, el resultado debe estar en formato HTML, o cualquier
|
|
Packit |
90a5c9 |
otro formato que su navegador sea capaz de mostrar. La mayor
|
|
Packit |
90a5c9 |
parte de las veces, será HTML, pero otras escribirá un programa
|
|
Packit |
90a5c9 |
CGI que devuelve una imagen gif, u otro contenido no-HTML.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Aparte de estas dos cosas, escribir un programa en CGI se
|
|
Packit |
90a5c9 |
parecerá bastante a cualquier otro programa que vaya a escribir.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
A continuación podrá ver un ejemplo de programa CGI que muestra
|
|
Packit |
90a5c9 |
una línea de texto en su navegador. Escriba lo siguiente,
|
|
Packit |
90a5c9 |
guárdelo en un archivo con el nombre first.pl , y
|
|
Packit |
90a5c9 |
póngalo en su directorio cgi-bin .
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
#!/usr/bin/perl
|
|
Packit |
90a5c9 |
print "Content-type: text/html\n\n";
|
|
Packit |
90a5c9 |
print "Hola, Mundo.";
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Incluso si Perl no le resulta familiar, podrá ver lo que está
|
|
Packit |
90a5c9 |
ocurriendo aquí. La primera línea le dice a Apache (o a
|
|
Packit |
90a5c9 |
cualquier shell en la que se esté ejecutando) que este programa
|
|
Packit |
90a5c9 |
puede ejecutarse con el intérprete en la ubicación
|
|
Packit |
90a5c9 |
/usr/bin/perl . La segunda línea imprime la
|
|
Packit |
90a5c9 |
declaración de Content-Type que mencionamos antes, seguida de
|
|
Packit |
90a5c9 |
dos pares de retornos de carro. Esto pone una línea en blanco
|
|
Packit |
90a5c9 |
después de la cabecera para indicar el final de las cabeceras
|
|
Packit |
90a5c9 |
HTTP, y el comienzo del cuerpo del contenido. La tercera
|
|
Packit |
90a5c9 |
imprime la cadena de caracteres "Hola, Mundo.". Y ese es el
|
|
Packit |
90a5c9 |
final del programa.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Si lo abre con su navegador favorito y le dice que solicite la
|
|
Packit |
90a5c9 |
dirección
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
http://www.example.com/cgi-bin/first.pl
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
o donde quiera que pusiera el archivo, verá una línea
|
|
Packit |
90a5c9 |
Hola, Mundo. aparecerán la ventana del navegador. No es
|
|
Packit |
90a5c9 |
muy emocionante, pero una vez que consiga que funcione podrá hacer
|
|
Packit |
90a5c9 |
lo mismo con casi cualquier programa.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Hay 4 cosas básicas que puede llegar a ver en su navegador cuando
|
|
Packit |
90a5c9 |
intenta acceder a un programa CGI desde la web:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
El resultado del programa CGI
|
|
Packit |
90a5c9 |
¡Genial! Esto indica que todo funcionó correctamente. Si el
|
|
Packit |
90a5c9 |
resultado es correcto, pero el navegador no lo procesa
|
|
Packit |
90a5c9 |
correctamente, asegúrese de que tiene especificado
|
|
Packit |
90a5c9 |
correctamente el Content-Type en su programa
|
|
Packit |
90a5c9 |
CGI.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
El código fuente de su programa CGI o un mensaje del tipo
|
|
Packit |
90a5c9 |
"POST Method Not Allowed".
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Eso significa que no ha configurado Apache de manera
|
|
Packit |
90a5c9 |
apropiada para interpretar su programa CGI. Relea la sección
|
|
Packit |
90a5c9 |
de Configurando Apache e intente
|
|
Packit |
90a5c9 |
encontrar qué le falta.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Un mensaje que empieza con "Forbidden"
|
|
Packit |
90a5c9 |
Eso significa que hay un problema de permisos. Compruebe el
|
|
Packit |
90a5c9 |
Log de Errores de Apache y la
|
|
Packit |
90a5c9 |
sección de más abajo de Permisos de
|
|
Packit |
90a5c9 |
Fichero.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Un mensaje indicando "Internal Server Error"
|
|
Packit |
90a5c9 |
Si comprueba el Log de errores de
|
|
Packit |
90a5c9 |
Apache, probablemente encontrará que indica "Premature
|
|
Packit |
90a5c9 |
end of script headers", posiblemente acompañado de otro
|
|
Packit |
90a5c9 |
mensaje de error generado por su programa CGI. En este caso,
|
|
Packit |
90a5c9 |
querrá comprobar cada una de las secciones de más adelante
|
|
Packit |
90a5c9 |
para ver qué impide que su programa CGI genere las cabeceras
|
|
Packit |
90a5c9 |
HTTP adecuadas.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Recuerde que el servidor no se ejecuta con su usuario. Es decir,
|
|
Packit |
90a5c9 |
cuando el servidor arranca, está funcionando con un usuario sin
|
|
Packit |
90a5c9 |
privilegios, generalmente el usuario nobody , o
|
|
Packit |
90a5c9 |
www-data , así que necesitará permisos extra para
|
|
Packit |
90a5c9 |
ejecutar los archivos de los que usted es dueño. Generalmente,
|
|
Packit |
90a5c9 |
el método para dar permisos suficientes para que se pueda
|
|
Packit |
90a5c9 |
ejecutar con nobody es dar permisos de ejecución a
|
|
Packit |
90a5c9 |
todo el mundo en el fichero:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
chmod a+x first.pl
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Además, si su programa lee desde o escribe a cualquier otro/s
|
|
Packit |
90a5c9 |
archivo/s, esos archivos necesitarán tener los permisos correctos
|
|
Packit |
90a5c9 |
para permitir esas acciones.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Cuando ejecuta un programa desde la línea de comandos, usted tiene
|
|
Packit |
90a5c9 |
cierta información que se le pasa a la shell sin que usted se
|
|
Packit |
90a5c9 |
percate de ello. Por ejemplo, usted tiene un PATH ,
|
|
Packit |
90a5c9 |
que le indica a la shell dónde debe buscar archivos a los que usted
|
|
Packit |
90a5c9 |
hace referencia.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Cuando un programa se ejecuta a través del servidor web como un
|
|
Packit |
90a5c9 |
programa CGI, puede que no tenga el mismo PATH .
|
|
Packit |
90a5c9 |
Cualquier programa que invoque desde su programa CGI (como por
|
|
Packit |
90a5c9 |
ejemplo sendmail ) necesitará que se le indique la
|
|
Packit |
90a5c9 |
ruta absoluta, así la shell puede encontrarlos cuando intenta
|
|
Packit |
90a5c9 |
ejecutar su programa CGI.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Una manifestación común de esto es la ruta del intérprete del
|
|
Packit |
90a5c9 |
script (a menudo perl ) indicado en la primera línea
|
|
Packit |
90a5c9 |
de su programa CGI, que parecerá algo como:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
#!/usr/bin/perl
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Asegúrese de que éste es de hecho el path de su intérprete.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Cuando edita scripts CGI en Windows, los caracteres de retorno de
|
|
Packit |
90a5c9 |
carro podrían añadirse a la línea donde se especifica el intérprete.
|
|
Packit |
90a5c9 |
Asegúrese de que los archivos se transfieren al servidor en modo
|
|
Packit |
90a5c9 |
ASCII. Fallar en esto puede acabar con avisos del tipo "Command not
|
|
Packit |
90a5c9 |
found" del Sistema Operativo, debido a que éste no reconoce los
|
|
Packit |
90a5c9 |
caracteres de final de línea interpretados como parte del nombre
|
|
Packit |
90a5c9 |
de fichero del intérprete.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Si su programa CGI depende de variables de entorno no estándar, necesitará
|
|
Packit |
90a5c9 |
asegurarse de que Apache pasa esas variables.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Cuando no encuentra ciertas cabeceras HTTP del entorno, asegúrese
|
|
Packit |
90a5c9 |
de que están formateadas según el
|
|
Packit |
90a5c9 |
RFC 2616,
|
|
Packit |
90a5c9 |
sección 4.2: Nombres de Cabeceras deben empezar con una letra,
|
|
Packit |
90a5c9 |
seguida solo de letras, números o guión. Cualquier cabecera
|
|
Packit |
90a5c9 |
que no cumpla esta regla será ignorada de manera silenciosa.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
La mayor parte de las veces cuando un programa CGI falla, es por un
|
|
Packit |
90a5c9 |
problema en el programa mismo. Esto ocurre generalmente cuando se
|
|
Packit |
90a5c9 |
maneja bien con "esto del CGI", y ya no comete los dos errores
|
|
Packit |
90a5c9 |
mencionados más arriba. Lo primero que hay que hacer es asegurarse
|
|
Packit |
90a5c9 |
de que su programa se ejecuta correctamente en línea de comandos
|
|
Packit |
90a5c9 |
antes de probarlo a través del servidor web. Por ejemplo,
|
|
Packit |
90a5c9 |
intente:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
cd /usr/local/apache2/cgi-bin
|
|
Packit |
90a5c9 |
./first.pl
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
(No llame al intérprete de perl . La consola y Apache
|
|
Packit |
90a5c9 |
tienen que poder encontrar el intérprete usando línea
|
|
Packit |
90a5c9 |
línea de información en la primera
|
|
Packit |
90a5c9 |
línea del script.)
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Lo primero que debe ver escrito por su programa es un conjunto de
|
|
Packit |
90a5c9 |
cabeceras HTTP, incluyendo el Content-Type ,
|
|
Packit |
90a5c9 |
seguido de una línea en blanco. Si ve alguna otra cosa, Apache
|
|
Packit |
90a5c9 |
devolverá el error Premature end of script headers si
|
|
Packit |
90a5c9 |
intenta lanzar el script en el servidor web. Vea
|
|
Packit |
90a5c9 |
Escribiendo un programa CGI más arriba para
|
|
Packit |
90a5c9 |
más detalle.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
El log de errores es su amigo. Cualquier cosa que vaya mal generará
|
|
Packit |
90a5c9 |
un mensaje en el log de errores. Debería mirar siempre ahí primero.
|
|
Packit |
90a5c9 |
Si el lugar donde está alojando su sitio web no permite que acceda
|
|
Packit |
90a5c9 |
al log de errores, probablemente debería alojarlo en otro sitio.
|
|
Packit |
90a5c9 |
Aprenda a leer el log de errores y se dará cuenta de que enseguida
|
|
Packit |
90a5c9 |
averiguará el motivo del error y lo solucionará rápidamente.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
El programa de soporte suexec permite
|
|
Packit |
90a5c9 |
que programas CGI se ejecuten con permisos de usuario distintos,
|
|
Packit |
90a5c9 |
dependiendo del virtualhost o el directorio home donde se
|
|
Packit |
90a5c9 |
encuentren. Suexec tiene una comprobación de permisos muy estricta,
|
|
Packit |
90a5c9 |
y cualquier fallo en esa comprobación dará como resultado un error
|
|
Packit |
90a5c9 |
con el mensaje Premature end of script headers .
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Para comprobar si está usando Suexec, ejecute
|
|
Packit |
90a5c9 |
apachectl -V y compruebe la ubicación de
|
|
Packit |
90a5c9 |
SUEXEC_BIN . Si Apache encuentra un binario
|
|
Packit |
90a5c9 |
suexec al arrancar, suexec se activará.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
A menos que comprenda suxec perfectamente, no debería usarlo.
|
|
Packit |
90a5c9 |
Para desactivar suexec, basta con eliminar el binario
|
|
Packit |
90a5c9 |
suexec al que apunta SUEXEC_BIN y
|
|
Packit |
90a5c9 |
reiniciar el servidor. Si después de leer sobre
|
|
Packit |
90a5c9 |
suexec todavía quiere usarlo, entonces
|
|
Packit |
90a5c9 |
ejecute suexec -V para encontrar la ubicación del
|
|
Packit |
90a5c9 |
fichero log de suexec, y use ese log para encontrar que política no
|
|
Packit |
90a5c9 |
está cumpliendo.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
En cuanto tenga conocimiento avanzado de programación CGI, le será
|
|
Packit |
90a5c9 |
útil comprender más de lo que ocurre entre bastidores.
|
|
Packit |
90a5c9 |
Específicamente, cómo el navegador y el servidor se comunican el uno
|
|
Packit |
90a5c9 |
con el otro. Porque aunque esté muy bien escribir un programa que
|
|
Packit |
90a5c9 |
diga "Hola, Mundo.", no tiene una gran utilidad.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Las variables de entorno son valores que están ahí cuando
|
|
Packit |
90a5c9 |
usa el ordenador. Son cosas útiles como el path (donde su ordenador
|
|
Packit |
90a5c9 |
busca el archivo específico que se lanza cuando usted escribe un
|
|
Packit |
90a5c9 |
comando), su nombre de usuario, el tipo de terminal que usa, etc.
|
|
Packit |
90a5c9 |
Para una lista completa de la variables de entorno normales que se
|
|
Packit |
90a5c9 |
se usan en su día a día escriba env en la línea de
|
|
Packit |
90a5c9 |
comandos.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Durante la transacción CGI, el servidor y el navegador también
|
|
Packit |
90a5c9 |
configuran variables de entorno, y así pueden comunicarse entre
|
|
Packit |
90a5c9 |
ellos. Cosas como el tipo de navegador (Netscape, IE, Lynx), el tipo
|
|
Packit |
90a5c9 |
de servidor (Apache, IIS, WebSite), el nombre del programa CGI que
|
|
Packit |
90a5c9 |
se está ejecutando, etc.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Estas variables están disponibles para el programador de CGI, y son
|
|
Packit |
90a5c9 |
la mitad de la historia de la comunicación cliente-servidor. La
|
|
Packit |
90a5c9 |
lista completa de las variables necesarias se encuentra en
|
|
Packit |
90a5c9 |
el RFC de Common Gateway
|
|
Packit |
90a5c9 |
Interface.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Este sencillo programa CGI en Perl mostrará todas las variables
|
|
Packit |
90a5c9 |
de entorno que se están pasando entre el cliente y el navegador. Dos
|
|
Packit |
90a5c9 |
programas similares están incluidos en el directorio
|
|
Packit |
90a5c9 |
cgi-bin de la distribución de Apache. Tenga en cuenta
|
|
Packit |
90a5c9 |
que algunas variables son necesarias mientras que otras son
|
|
Packit |
90a5c9 |
opcionales, así que es posible que vea algunas variables que no
|
|
Packit |
90a5c9 |
están en la lista oficial. Adicionalmente, Apache aporta distintas
|
|
Packit |
90a5c9 |
maneras diferentes para que pueda
|
|
Packit |
90a5c9 |
añadir sus variables de entorno a las
|
|
Packit |
90a5c9 |
básicas que se proveen por defecto.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
#!/usr/bin/perl
|
|
Packit |
90a5c9 |
use strict;
|
|
Packit |
90a5c9 |
use warnings;
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
print "Content-type: text/html\n\n";
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
foreach my $key (keys %ENV) {
|
|
Packit |
90a5c9 |
print "$key --> $ENV{$key}<br>";
|
|
Packit |
90a5c9 |
}
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Otra comunicación entre el servidor y el cliente ocurre en la
|
|
Packit |
90a5c9 |
entrada estándar (STDIN ) y la salida estándar
|
|
Packit |
90a5c9 |
(STDOUT ). En el contexto normal de cada día,
|
|
Packit |
90a5c9 |
STDIN es la entrada con el teclado, o un fichero que se
|
|
Packit |
90a5c9 |
le da a un programa para que actúe sobre él, y STDOUT
|
|
Packit |
90a5c9 |
generalmente es la consola o la pantalla.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Cuando hace POST con un formulario de web a un programa
|
|
Packit |
90a5c9 |
CGI, los datos en ese formulario se empaquetan en un formato especial
|
|
Packit |
90a5c9 |
que se entrega a su programa CGI en el STDIN .
|
|
Packit |
90a5c9 |
Entonces el programa puede procesar la información como si le llegara
|
|
Packit |
90a5c9 |
desde el teclado, o desde un fichero.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
El "formato especial" es muy sencillo. Un nombre de campo y su
|
|
Packit |
90a5c9 |
valor se asocian juntos con el signo igual (=), y pares de valores
|
|
Packit |
90a5c9 |
se asocian juntos con el ampersand ó et en español (&).
|
|
Packit |
90a5c9 |
Caracteres inconvenientes como los espacios, ampersands y signos de
|
|
Packit |
90a5c9 |
igual, se convierten en su equivalente hexadecimal para no impidan
|
|
Packit |
90a5c9 |
el funcionamiento correcto del programa. La cadena de datos al
|
|
Packit |
90a5c9 |
completo será algo como:
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
A veces tendrá este tipo de cadena de caracteres al final de una
|
|
Packit |
90a5c9 |
URL. Cuando esto ocurre, el servidor pone esa cadena en una variable
|
|
Packit |
90a5c9 |
de entorno que se llama QUERY_STRING . Esto se llama
|
|
Packit |
90a5c9 |
solicitud GET . Su formulario HTML especifica si se usa
|
|
Packit |
90a5c9 |
un GET o un POST para entregar la
|
|
Packit |
90a5c9 |
información, configurando el atributo METHOD en la
|
|
Packit |
90a5c9 |
etiqueta FORM .
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Su programa es el responsable de convertir esa cadena de
|
|
Packit |
90a5c9 |
caracteres en información útil. Afortunadamente, hay librerías y
|
|
Packit |
90a5c9 |
módulos disponibles que ayudan a procesar la información, así como a
|
|
Packit |
90a5c9 |
gestionar los distintos aspectos de su programa CGI.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Cuando escribe programas CGI, debería considerar usar una librería de
|
|
Packit |
90a5c9 |
código, o módulo, para hacer todo el trabajo más arduo por usted.
|
|
Packit |
90a5c9 |
Esto lleva a tener menos errores y un desarrollo de código más
|
|
Packit |
90a5c9 |
rápido.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Si está escribiendo un programa CGI en Perl, existen módulos
|
|
Packit |
90a5c9 |
disponibles en CPAN. El módulo más
|
|
Packit |
90a5c9 |
conocido para este propósito es CGI.pm . Quizás quiera
|
|
Packit |
90a5c9 |
considerar CGI::Lite , que implementa una funcionalidad
|
|
Packit |
90a5c9 |
mínima, que es todo lo que se necesita en la mayoría de los programas.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Si está escribiendo programas CGI en C, hay varidad de opciones. Una
|
|
Packit |
90a5c9 |
de estas es la librería CGIC , de
|
|
Packit |
90a5c9 |
http://www.boutell.com/cgic/.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
La especificación actual de CGI está disponible en el
|
|
Packit |
90a5c9 |
RFC de Common Gateway
|
|
Packit |
90a5c9 |
Interface.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Cuando envíe una pregunta sobre un problema de CGI, o bien a una
|
|
Packit |
90a5c9 |
lista de correo, o a un grupo de noticias, asegúrese de que facilita suficiente
|
|
Packit |
90a5c9 |
información de lo que ha ocurrido, de lo que espera que ocurra, y de
|
|
Packit |
90a5c9 |
lo que está ocurriendo en su lugar que es diferente, el servidor que
|
|
Packit |
90a5c9 |
está ejecutando, en qué lenguaje CGI está hecho su programa, y si es
|
|
Packit |
90a5c9 |
posible, el código que falla. Esto hará encontrar el problema mucho más
|
|
Packit |
90a5c9 |
fácil.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Tenga en cuenta que las preguntas sobre problemas CGI
|
|
Packit |
90a5c9 |
nunca deberían enviarse a la base de datos de bugs de
|
|
Packit |
90a5c9 |
bugs de Apache a menos que esté seguro de haber encontrado un
|
|
Packit |
90a5c9 |
problema en el código fuente de Apache.
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
|
|
Packit |
90a5c9 |
Idiomas disponibles: en |
|
|
Packit |
90a5c9 |
es |
|
|
Packit |
90a5c9 |
fr |
|
|
Packit |
90a5c9 |
ja |
|
|
Packit |
90a5c9 |
ko
|
|
Packit |
90a5c9 |
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 again by our moderators 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 Freenode, or sent to our mailing lists.
|
|
Packit |
90a5c9 |
<script type="text/javascript">
|
|
Packit |
90a5c9 |
var comments_shortname = 'httpd';
|
|
Packit |
90a5c9 |
var comments_identifier = 'http://httpd.apache.org/docs/2.4/howto/cgi.html';
|
|
Packit |
90a5c9 |
(function(w, d) {
|
|
Packit |
90a5c9 |
if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
|
|
Packit |
90a5c9 |
d.write('
|
|
Packit |
90a5c9 |
var s = d.createElement('script');
|
|
Packit |
90a5c9 |
s.type = 'text/javascript';
|
|
Packit |
90a5c9 |
s.async = true;
|
|
Packit |
90a5c9 |
s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
|
|
Packit |
90a5c9 |
(d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
|
|
Packit |
90a5c9 |
}
|
|
Packit |
90a5c9 |
else {
|
|
Packit |
90a5c9 |
d.write('
|
|
Packit |
90a5c9 |
}
|
|
Packit |
90a5c9 |
})(window, document);
|
|
Packit |
90a5c9 |
//--></script>
|
|
Packit |
90a5c9 |
Copyright 2018 The Apache Software Foundation. Licencia bajo los términos de la Apache License, Version 2.0.
|
|
Packit |
90a5c9 |
Módulos | Directivas | Preguntas Frecuentes | Glosario | Mapa del sitio web <script type="text/javascript">
|
|
Packit |
90a5c9 |
if (typeof(prettyPrint) !== 'undefined') {
|
|
Packit |
90a5c9 |
prettyPrint();
|
|
Packit |
90a5c9 |
}
|
|
Packit |
90a5c9 |
//--></script>
|
|
Packit |
90a5c9 |
</body></html>
|