mirror of
				https://github.com/apache/httpd.git
				synced 2025-11-03 17:53:20 +03:00 
			
		
		
		
	git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1776570 13f79535-47bb-0310-9956-ffa450edef68
		
			
				
	
	
		
			595 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			595 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
<?xml version='1.0' encoding='UTF-8' ?>
 | 
						|
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
 | 
						|
<?xml-stylesheet type="text/xsl" href="../style/manual.es.xsl"?>
 | 
						|
<!-- English Revision: 1773244 -->
 | 
						|
<!-- Spanish translation : Daniel Ferradal -->
 | 
						|
<!-- Reviewed by Luis Gil de Bernabé Pfeiffer lgilbernabe[AT]apache.org -->
 | 
						|
 | 
						|
<!--
 | 
						|
 Licensed to the Apache Software Foundation (ASF) under one or more
 | 
						|
 contributor license agreements.  See the NOTICE file distributed with
 | 
						|
 this work for additional information regarding copyright ownership.
 | 
						|
 The ASF licenses this file to You under the Apache License, Version 2.0
 | 
						|
 (the "License"); you may not use this file except in compliance with
 | 
						|
 the License.  You may obtain a copy of the License at
 | 
						|
 | 
						|
     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
 Unless required by applicable law or agreed to in writing, software
 | 
						|
 distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 See the License for the specific language governing permissions and
 | 
						|
 limitations under the License.
 | 
						|
-->
 | 
						|
 | 
						|
<manualpage metafile="cgi.xml.meta">
 | 
						|
	<parentdocument href="./">How-To / Tutoriales</parentdocument>
 | 
						|
	<title>Tutorial de Apache: Contenido Dinámico con CGI</title>
 | 
						|
	
 | 
						|
    <section id="intro">
 | 
						|
	    <title>Introducción</title>
 | 
						|
		<related>
 | 
						|
			<modulelist>
 | 
						|
		        <module>mod_alias</module>
 | 
						|
		        <module>mod_cgi</module>
 | 
						|
		        <module>mod_cgid</module>
 | 
						|
			</modulelist>
 | 
						|
 | 
						|
			<directivelist>
 | 
						|
				<directive module="mod_mime">AddHandler</directive>
 | 
						|
       			<directive module="core">Options</directive>
 | 
						|
       			<directive module="mod_alias">ScriptAlias</directive>
 | 
						|
    		</directivelist>
 | 
						|
    	</related>
 | 
						|
 | 
						|
    	<p>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.</p>
 | 
						|
	</section>
 | 
						|
 | 
						|
	<section id="configuring">
 | 
						|
		<title>Configurando Apache para permitir CGI</title>
 | 
						|
 | 
						|
        <p>Para conseguir que sus programas CGI funcionen correctamente,
 | 
						|
	    deberá configurar Apache para que permita la ejecución de CGI. Hay
 | 
						|
	    distintas formas de hacerlo.</p>
 | 
						|
 | 
						|
        <note type="warning">Nota: Si Apache ha sido compilado con soporte
 | 
						|
        de módulos compartidos, necesitará que el módulo de CGI esté cargado;
 | 
						|
        en su <code>httpd.conf</code> tiene que asegurarse de que la directiva
 | 
						|
        <directive module="mod_so">LoadModule</directive>
 | 
						|
        no ha sido comentada. Una directiva configurada correctamente sería así:
 | 
						|
            
 | 
						|
            <highlight language="config">
 | 
						|
                LoadModule cgid_module modules/mod_cgid.so
 | 
						|
            </highlight>
 | 
						|
 | 
						|
        En Windows, o si usa un mpm que no es multihilo, como prefork, una 
 | 
						|
        directiva configurada correctamente podría definirse así: 
 | 
						|
 | 
						|
        <highlight language="config">
 | 
						|
            LoadModule cgi_module modules/mod_cgi.so
 | 
						|
        </highlight></note>
 | 
						|
 | 
						|
        <section id="scriptalias">
 | 
						|
            <title>ScriptAlias</title>
 | 
						|
 | 
						|
            <p>La directiva
 | 
						|
            <directive module="mod_alias">ScriptAlias</directive>
 | 
						|
            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.</p>
 | 
						|
        
 | 
						|
            <p>La directiva 
 | 
						|
            <directive module="mod_alias">ScriptAlias</directive> se puede 
 | 
						|
            definir así:</p>
 | 
						|
 | 
						|
            <highlight language="config">
 | 
						|
                ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
 | 
						|
            </highlight>
 | 
						|
        
 | 
						|
            <p>El ejemplo que se muestra es de un archivo de configuración
 | 
						|
            <code>httpd.conf</code> por defecto si usted instaló Apache
 | 
						|
            en la ubicación por defecto. La directiva
 | 
						|
            <directive module="mod_alias">ScriptAlias</directive> es muy 
 | 
						|
            parecida a la directiva <directive module="mod_alias">Alias</directive>,
 | 
						|
            ésta define un prefijo de URL que se enlaza a un directorio 
 | 
						|
            en particular. <directive>Alias</directive> y
 | 
						|
            <directive>ScriptAlias</directive> se usan generalmente para 
 | 
						|
            directorios que se encuentran fuera del directorio 
 | 
						|
            <directive module="core">DocumentRoot</directive>. La diferencia
 | 
						|
            entre <directive>Alias</directive> y <directive>ScriptAlias</directive>
 | 
						|
            es que en <directive>ScriptAlias</directive> 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 
 | 
						|
            <code>/cgi-bin/</code> debería servirse desde el directorio
 | 
						|
            <code>/usr/local/apache2/cgi-bin/</code>, y debería tratarse como un
 | 
						|
            programa CGI.</p>
 | 
						|
 | 
						|
            <p>Por ejemplo, si se solicita la URL
 | 
						|
            <code>http://www.example.com/cgi-bin/test.pl</code>,
 | 
						|
            Apache intentará ejecutar el archivo
 | 
						|
            <code>/usr/local/apache2/cgi-bin/test.pl</code> 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.</p>
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="nonscriptalias">
 | 
						|
            <title>CGI fuera de directorios ScriptAlias</title>
 | 
						|
 | 
						|
            <p>Los programas CGI habitualmente se restringen a los directorios de
 | 
						|
            <directive module="mod_alias">ScriptAlias</directive> 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
 | 
						|
            <directive module="mod_userdir">UserDir</directive>. Si quieren 
 | 
						|
            tener sus propios programas CGI, pero no tienen acceso al directorio 
 | 
						|
            principal <code>cgi-bin</code>, necesitarán ser capaces de 
 | 
						|
            ejecutar sus scripts CGI en algún otro sitio.</p>
 | 
						|
      
 | 
						|
            <p>Hay dos pasos a seguir para permitir la ejecución CGI en directorios
 | 
						|
            seleccionados de manera arbitraria. Primero, el handler 
 | 
						|
            <code>cgi-script</code> debe estar activado usando la directiva 
 | 
						|
            <directive module="mod_mime">AddHandler</directive> o la directiva 
 | 
						|
            <directive module="core">SetHandler</directive>. Segundo, el parámetro
 | 
						|
            <code>ExecCGI</code> debe estar definido en la directiva
 | 
						|
            <directive module="core">Options</directive>.</p>
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="options">
 | 
						|
            <title>Usando Options de manera explícita para permitir ejecución de 
 | 
						|
            CGI</title>
 | 
						|
 | 
						|
            <p>Puede usar la directiva 
 | 
						|
            <directive module="core">Options</directive>, en el archivo de 
 | 
						|
            configuración principal para especificar que se permite la ejecución 
 | 
						|
            de CGI en un directorio en particular:</p>
 | 
						|
 | 
						|
            <highlight language="config">
 | 
						|
<Directory "/usr/local/apache2/htdocs/somedir">
 | 
						|
    Options +ExecCGI
 | 
						|
</Directory>
 | 
						|
            </highlight>
 | 
						|
            
 | 
						|
            <p>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 
 | 
						|
            <directive module="mod_mime">AddHandler</directive> le indica al 
 | 
						|
            servidor que debe tratar a todos los archivos con la extensión 
 | 
						|
            <code>cgi</code> o <code>pl</code> como programas CGI:</p>
 | 
						|
 | 
						|
            <highlight language="config">
 | 
						|
                AddHandler cgi-script .cgi .pl
 | 
						|
            </highlight>
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="htaccess">
 | 
						|
            <title>Ficheros .htaccess</title>
 | 
						|
 | 
						|
            <p>El <a href="htaccess.html">tutorial <code>.htaccess</code></a>
 | 
						|
            enseña como activar programas CGI si no tienes acceso a 
 | 
						|
            <code>httpd.conf</code>.</p>
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="userdir">
 | 
						|
            <title>Directorios de Usuario</title>
 | 
						|
 | 
						|
            <p>Para permitir la ejecución de programas CGI para cualquier 
 | 
						|
            archivo que acabe en <code>.cgi</code> en directorios de usuario, 
 | 
						|
            puedes usar la siguiente configuración:</p>
 | 
						|
 | 
						|
            <highlight language="config">
 | 
						|
<Directory "/home/*/public_html">
 | 
						|
    Options +ExecCGI
 | 
						|
    AddHandler cgi-script .cgi
 | 
						|
</Directory>
 | 
						|
            </highlight>
 | 
						|
 | 
						|
            <p>Si quiere designar un subdirectorio <code>cgi-bin</code> dentro 
 | 
						|
            de un directorio de usuario en el que todos los ficheros serán 
 | 
						|
            tratados como un programa CGI, puede usar lo siguiente:</p>
 | 
						|
 | 
						|
            <highlight language="config">
 | 
						|
<Directory "/home/*/public_html/cgi-bin">
 | 
						|
    Options ExecCGI
 | 
						|
    SetHandler cgi-script
 | 
						|
</Directory>
 | 
						|
            </highlight>
 | 
						|
        </section>
 | 
						|
    </section>
 | 
						|
 | 
						|
    <section id="writing">
 | 
						|
        <title>Escribiendo un programa CGI</title>
 | 
						|
 | 
						|
        <p>Hay dos diferencias principales entre programación ``regular'' y 
 | 
						|
        programación en CGI.</p>
 | 
						|
 | 
						|
        <p>Primera, el resultado al completo de tu programa CGI debe estar 
 | 
						|
        precedido de una cabecera <glossary>MIME-type</glossary>. Esta
 | 
						|
        cabecera HTTP le indica al cliente que tipo de contenido está
 | 
						|
        recibiendo. La mayor parte de las veces, ésto será algo como:</p>
 | 
						|
 | 
						|
        <example>
 | 
						|
            Content-type: text/html
 | 
						|
        </example>
 | 
						|
 | 
						|
        <p>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.</p>
 | 
						|
 | 
						|
        <p>Aparte de estas dos cosas, escribir un programa en CGI se 
 | 
						|
        parecerá bastante a cualquier otro programa que vaya a escribir.
 | 
						|
        </p>
 | 
						|
 | 
						|
 | 
						|
        <section id="firstcgi">
 | 
						|
            <title>Su primer programa CGI</title>
 | 
						|
 | 
						|
            <p>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 <code>first.pl</code>, y 
 | 
						|
            póngalo en su directorio <code>cgi-bin</code>.</p>
 | 
						|
 | 
						|
            <highlight language="perl">
 | 
						|
#!/usr/bin/perl
 | 
						|
print "Content-type: text/html\n\n";
 | 
						|
print "Hola, Mundo.";
 | 
						|
            </highlight>
 | 
						|
 | 
						|
            <p>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
 | 
						|
            <code>/usr/bin/perl</code>. 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.</p>
 | 
						|
 | 
						|
            <p>Si lo abre con su navegador favorito y le dice que solicite la 
 | 
						|
            dirección</p>
 | 
						|
 | 
						|
            <example>
 | 
						|
                http://www.example.com/cgi-bin/first.pl
 | 
						|
            </example>
 | 
						|
 | 
						|
            <p>o donde quiera que pusiera el archivo, verá una línea
 | 
						|
            <code>Hola, Mundo.</code> 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.</p>
 | 
						|
        </section>
 | 
						|
    </section>
 | 
						|
 | 
						|
    <section id="troubleshoot">
 | 
						|
        <title>¡Pero todavía no funciona!</title>
 | 
						|
 | 
						|
        <p>Hay 4 cosas básicas que puede llegar a ver en su navegador cuando
 | 
						|
        intenta acceder a un programa CGI desde la web:</p>
 | 
						|
 | 
						|
        <dl>
 | 
						|
            <dt>El resultado del programa CGI</dt>
 | 
						|
            <dd>¡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 <code>Content-Type</code> en su programa 
 | 
						|
            CGI.</dd>
 | 
						|
 | 
						|
            <dt>El código fuente de su programa CGI o un mensaje del tipo 
 | 
						|
            "POST Method Not Allowed".</dt>
 | 
						|
 | 
						|
            <dd>Eso significa que no ha configurado Apache de manera
 | 
						|
            apropiada para interpretar su programa CGI. Relea la sección
 | 
						|
            de <a href="#configuring">Configurando Apache</a> e intente
 | 
						|
            encontrar qué le falta.</dd>
 | 
						|
 | 
						|
            <dt>Un mensaje que empieza con "Forbidden"</dt>
 | 
						|
            <dd>Eso significa que hay un problema de permisos. Compruebe el
 | 
						|
            <a href="#errorlogs">Log de Errores de Apache</a> y la
 | 
						|
            sección de más abajo de <a href="#permissions">Permisos de
 | 
						|
            Fichero</a>.</dd>
 | 
						|
 | 
						|
            <dt>Un mensaje indicando "Internal Server Error"</dt>
 | 
						|
            <dd>Si comprueba el <a href="#errorlogs">Log de errores de
 | 
						|
            Apache</a>, 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.</dd>
 | 
						|
            </dl>
 | 
						|
 | 
						|
        <section id="permissions">
 | 
						|
            <title>Permisos de Fichero</title>
 | 
						|
 | 
						|
            <p>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 <code>nobody</code>, o
 | 
						|
            <code>www-data</code>, así que necesitará permisos extra para
 | 
						|
            ejecutar los archivos de los que usted es dueño. Generalmente, 
 | 
						|
            el método para dar permisos suficientes para que se pueda 
 | 
						|
            ejecutar con <code>nobody</code> es dar permisos de ejecución a 
 | 
						|
            todo el mundo en el fichero:</p>
 | 
						|
 | 
						|
            <example>
 | 
						|
                chmod a+x first.pl
 | 
						|
            </example>
 | 
						|
 | 
						|
            <p>Además, si su programa lee desde o escribe a cualquier otro/s
 | 
						|
            archivo/s, esos archivos necesitarán tener los permisos correctos
 | 
						|
            para permitir esas acciones.</p>
 | 
						|
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="pathinformation">
 | 
						|
            <title>Información de Ruta y Entorno</title>
 | 
						|
 | 
						|
            <p>Cuando ejecuta un programa desde la línea de comandos, usted tiene
 | 
						|
            cierta información que se le pasa a la shell sin que usted se
 | 
						|
            percate de ello. Por ejemplo, usted tiene un <code>PATH</code>,
 | 
						|
            que le indica a la shell dónde debe buscar archivos a los que usted
 | 
						|
            hace referencia.</p>
 | 
						|
 | 
						|
            <p>Cuando un programa se ejecuta a través del servidor web como un
 | 
						|
            programa CGI, puede que no tenga el mismo <code>PATH</code>. 
 | 
						|
            Cualquier programa que invoque desde su programa CGI (como por
 | 
						|
            ejemplo <code>sendmail</code>) necesitará que se le indique la
 | 
						|
            ruta absoluta, así la shell puede encontrarlos cuando intenta 
 | 
						|
            ejecutar su programa CGI.</p>
 | 
						|
 | 
						|
            <p>Una manifestación común de esto es la ruta del intérprete del 
 | 
						|
            script (a menudo <code>perl</code>) indicado en la primera línea
 | 
						|
            de su programa CGI, que parecerá algo como:</p>
 | 
						|
 | 
						|
            <highlight language="perl">
 | 
						|
                #!/usr/bin/perl
 | 
						|
            </highlight>
 | 
						|
 | 
						|
            <p>Asegúrese de que éste es de hecho el path de su intérprete.</p>
 | 
						|
            <note type="warning">
 | 
						|
            Cuando edita scripts CGI en Windows, los caracteres de retorno de
 | 
						|
            carro podrían añadirse a la línea donde se especifica el intérprete. 
 | 
						|
            Asegúrese 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 línea interpretados como parte del nombre
 | 
						|
            de fichero del intérprete.
 | 
						|
            </note>
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="missingenv">
 | 
						|
            <title>Faltan Variables de Entorno</title>
 | 
						|
 | 
						|
            <p>Si su programa CGI depende de <a
 | 
						|
            href="#env">variables de entorno</a> no estándar, necesitará
 | 
						|
            asegurarse de que Apache pasa esas variables.</p>
 | 
						|
 | 
						|
            <p>Cuando no encuentra ciertas cabeceras HTTP del entorno, asegúrese 
 | 
						|
            de que están formateadas según el 
 | 
						|
            <a href="http://tools.ietf.org/html/rfc2616">RFC 2616</a>, 
 | 
						|
            sección 4.2: Nombres de Cabeceras deben empezar con una letra, 
 | 
						|
            seguida solo de letras, números o guión. Cualquier cabecera 
 | 
						|
            que no cumpla esta regla será ignorada de manera silenciosa.</p>
 | 
						|
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="syntaxerrors">
 | 
						|
            <title>Errores de Programa</title>
 | 
						|
 | 
						|
            <p>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 más arriba. Lo primero que hay que hacer es asegurarse
 | 
						|
            de que su programa se ejecuta correctamente en línea de comandos 
 | 
						|
            antes de probarlo a través del servidor web.  Por ejemplo, 
 | 
						|
            intente:</p>
 | 
						|
 | 
						|
            <example>
 | 
						|
                cd /usr/local/apache2/cgi-bin<br/>
 | 
						|
                ./first.pl
 | 
						|
            </example>
 | 
						|
 | 
						|
            <p>(No llame al intérprete de <code>perl</code>. La consola y Apache 
 | 
						|
            tienen que poder encontrar el intérprete usando línea 
 | 
						|
            <a href="#pathinformation">línea de información</a> en la primera 
 | 
						|
            línea del script.)</p>
 | 
						|
 | 
						|
            <p>Lo primero que debe ver escrito por su programa es un conjunto de 
 | 
						|
            cabeceras HTTP, incluyendo el <code>Content-Type</code>,
 | 
						|
            seguido de una línea en blanco.  Si ve alguna otra cosa, Apache
 | 
						|
            devolverá el error <code>Premature end of script headers</code> si
 | 
						|
            intenta lanzar el script en el servidor web. Vea 
 | 
						|
            <a href="#writing">Escribiendo un programa CGI</a> más arriba para
 | 
						|
            más detalle.</p>
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="errorlogs">
 | 
						|
            <title>Log de Errores</title>
 | 
						|
 | 
						|
            <p>El log de errores es su amigo. Cualquier cosa que vaya mal generará 
 | 
						|
            un mensaje en el log de errores. Debería mirar siempre ahí primero. 
 | 
						|
            Si el lugar donde está alojando su sitio web no permite que acceda
 | 
						|
            al log de errores, probablemente debería 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á rápidamente.</p>
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="suexec">
 | 
						|
            <title>Suexec</title>
 | 
						|
 | 
						|
            <p>El programa de soporte <a href="../suexec.html">suexec</a> permite
 | 
						|
            que programas CGI se ejecuten con permisos de usuario distintos,
 | 
						|
            dependiendo del virtualhost o el directorio home donde se 
 | 
						|
            encuentren. Suexec tiene una comprobación de permisos muy estricta, 
 | 
						|
            y cualquier fallo en esa comprobación dará como resultado un error
 | 
						|
            con el mensaje <code>Premature end of script headers</code>.</p>
 | 
						|
 | 
						|
            <p>Para comprobar si está usando Suexec, ejecute 
 | 
						|
            <code>apachectl -V</code> y compruebe la ubicación de 
 | 
						|
            <code>SUEXEC_BIN</code>. Si Apache encuentra un binario 
 | 
						|
            <program>suexec</program> al arrancar, suexec se activará.</p>
 | 
						|
 | 
						|
            <p>A menos que comprenda suxec perfectamente, no debería usarlo.
 | 
						|
            Para desactivar suexec, basta con eliminar el binario 
 | 
						|
            <program>suexec</program> al que apunta <code>SUEXEC_BIN</code> y 
 | 
						|
            reiniciar el servidor. Si después de leer sobre 
 | 
						|
            <a href="../suexec.html">suexec</a> todavía quiere usarlo, entonces
 | 
						|
            ejecute <code>suexec -V</code> para encontrar la ubicación del 
 | 
						|
            fichero log de suexec, y use ese log para encontrar que política no
 | 
						|
            está cumpliendo.</p>
 | 
						|
        </section>
 | 
						|
    </section>
 | 
						|
 | 
						|
    <section id="behindscenes">
 | 
						|
        <title>¿Qué ocurre entre bastidores?</title>
 | 
						|
 | 
						|
        <p>En cuanto tenga conocimiento avanzado de programación CGI, le será 
 | 
						|
        útil comprender más de lo que ocurre entre bastidores. 
 | 
						|
        Específicamente, cómo 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.</p>
 | 
						|
 | 
						|
        <section id="env">
 | 
						|
            <title>Variables de Entorno</title>
 | 
						|
 | 
						|
            <p>Las variables de entorno son valores que están ahí cuando 
 | 
						|
            usa el ordenador. Son cosas útiles como el path (donde su ordenador
 | 
						|
            busca el archivo específico que se lanza cuando usted escribe un 
 | 
						|
            comando), su nombre de usuario, el tipo de terminal que usa, etc. 
 | 
						|
            Para una lista completa de la variables de entorno normales que se 
 | 
						|
            se usan en su día a día escriba <code>env</code> en la línea de 
 | 
						|
            comandos.</p>
 | 
						|
 | 
						|
            <p>Durante la transacción CGI, el servidor y el navegador también 
 | 
						|
            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.</p>
 | 
						|
 | 
						|
            <p>Estas variables están disponibles para el programador de CGI, y son 
 | 
						|
            la mitad de la historia de la comunicación cliente-servidor. La 
 | 
						|
            lista completa de las variables necesarias se encuentra en 
 | 
						|
            <a href="http://www.ietf.org/rfc/rfc3875">el RFC de Common Gateway
 | 
						|
            Interface</a>.</p>
 | 
						|
 | 
						|
            <p>Este sencillo programa CGI en Perl mostrará todas las variables 
 | 
						|
            de entorno que se están pasando entre el cliente y el navegador. Dos
 | 
						|
            programas similares están incluidos en el directorio 
 | 
						|
            <code>cgi-bin</code> de la distribución 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 
 | 
						|
            están en la lista oficial. Adicionalmente, Apache aporta distintas
 | 
						|
            maneras diferentes para que pueda
 | 
						|
            <a href="../env.html">añadir sus variables de entorno</a> a las 
 | 
						|
            básicas que se proveen por defecto.</p>
 | 
						|
 | 
						|
            <highlight language="perl">
 | 
						|
#!/usr/bin/perl
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
 | 
						|
print "Content-type: text/html\n\n";
 | 
						|
          
 | 
						|
foreach my $key (keys %ENV) {
 | 
						|
    print "$key --> $ENV{$key}<br>";
 | 
						|
}
 | 
						|
            </highlight>
 | 
						|
        </section>
 | 
						|
 | 
						|
        <section id="stdin">
 | 
						|
            <title>STDIN y STDOUT</title>
 | 
						|
 | 
						|
            <p>Otra comunicación entre el servidor y el cliente ocurre en la 
 | 
						|
            entrada estándar (<code>STDIN</code>) y la salida estándar 
 | 
						|
            (<code>STDOUT</code>). En el contexto normal de cada día, 
 | 
						|
            <code>STDIN</code> es la entrada con el teclado, o un fichero que se 
 | 
						|
            le da a un programa para que actúe sobre él, y <code>STDOUT</code>
 | 
						|
            generalmente es la consola o la pantalla.</p>
 | 
						|
 | 
						|
            <p>Cuando hace <code>POST</code> 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 <code>STDIN</code>.
 | 
						|
            Entonces el programa puede procesar la información como si le llegara
 | 
						|
            desde el teclado, o desde un fichero.</p>
 | 
						|
 | 
						|
            <p>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 español (&). 
 | 
						|
            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:</p>
 | 
						|
 | 
						|
  <example>
 | 
						|
        name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey
 | 
						|
  </example>
 | 
						|
 | 
						|
            <p>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 <code>QUERY_STRING</code>. Esto se llama 
 | 
						|
            solicitud <code>GET</code>. Su formulario HTML especifica si se usa 
 | 
						|
            un <code>GET</code> o un <code>POST</code> para entregar la 
 | 
						|
            información, configurando el atributo <code>METHOD</code> en la 
 | 
						|
            etiqueta <code>FORM</code>.</p>
 | 
						|
 | 
						|
            <p>Su programa es el responsable de convertir esa cadena de 
 | 
						|
            caracteres en información útil. Afortunadamente, hay librerías y 
 | 
						|
            módulos disponibles que ayudan a procesar la información, así como a 
 | 
						|
            gestionar los distintos aspectos de su programa CGI.</p>
 | 
						|
        </section>
 | 
						|
    </section>
 | 
						|
 | 
						|
    <section id="libraries">
 | 
						|
        <title>Módulos/librerías CGI</title>
 | 
						|
 | 
						|
        <p>Cuando escribe programas CGI, debería considerar usar una librería de
 | 
						|
        código, o módulo, para hacer todo el trabajo más arduo por usted.
 | 
						|
        Esto lleva a tener menos errores y un desarrollo de código más 
 | 
						|
        rápido.</p>
 | 
						|
 | 
						|
        <p>Si está escribiendo un programa CGI en Perl, existen módulos 
 | 
						|
        disponibles en <a href="http://www.cpan.org/">CPAN</a>. El módulo más
 | 
						|
        conocido para este propósito es <code>CGI.pm</code>. Quizás quiera
 | 
						|
        considerar <code>CGI::Lite</code>, que implementa una funcionalidad 
 | 
						|
        mínima, que es todo lo que se necesita en la mayoría de los programas.</p>
 | 
						|
 | 
						|
        <p>Si está escribiendo programas CGI en C, hay varidad de opciones. Una
 | 
						|
        de estas es la librería <code>CGIC</code>, de
 | 
						|
        <a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>.
 | 
						|
        </p>
 | 
						|
    </section>
 | 
						|
 | 
						|
    <section id="moreinfo">
 | 
						|
        <title>Para más información</title>
 | 
						|
 | 
						|
        <p>La especificación actual de CGI está disponible en el
 | 
						|
        <a href="http://www.ietf.org/rfc/rfc3875">RFC de Common Gateway
 | 
						|
        Interface</a>.</p>
 | 
						|
 | 
						|
        <p>Cuando envíe una pregunta sobre un problema de CGI, o bien a una 
 | 
						|
        lista de correo, o a un grupo de noticias, asegúrese de que facilita suficiente
 | 
						|
        información 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 código que falla. Esto hará encontrar el problema mucho más 
 | 
						|
        fácil.</p>
 | 
						|
 | 
						|
        <p>Tenga en cuenta que las preguntas sobre problemas CGI 
 | 
						|
        <strong>nunca</strong> deberían enviarse a la base de datos de bugs de
 | 
						|
        bugs de Apache a menos que esté seguro de haber encontrado un 
 | 
						|
        problema en el código fuente de Apache.</p>
 | 
						|
    </section>
 | 
						|
</manualpage>
 |