Redirecciones de url en script perl

Es muy común que en lugar de devolver una página web, un script tenga que redirigir hacia otro lugar. Veamos cómo hacer una redirección de url (url redirection) en un script Perl

Imprimir directamente la cabecera Location

Para ciertas cosas Perl resulta mágico: sólo con una línea de código puede resolver el problema

#!/usr/bin/perl
print "Location: http://example.com/\n\n"; #Status code 302

Importante: la redirección tiene que ser lo primero que se envíe, dado que corresponde a las cabeceras HTTP de la respuesta. En el momento en que se imprimen los 2 saltos de línea (\n\n) explícitamente se indica la terminación de esas cabeceras. Todo lo que venga después será tratado como contenido y presentado por el navegador.

 

Usar el módulo CGI

Mediante la función redirect del módulo CGI se puede hacer la redirección también de una manera muy sencilla:

#!/usr/bin/perl
use CGI qw(:standard);
print redirect('http://example.com'); #Status code 302

De manera análoga, se puede crear una instancia de CGI y sobre la misma invocar el método redirect.

#!/usr/bin/perl
use CGI qw(:standard);
my $q = new CGI;
print $q->redirect('http://example.com'); #Status code 302

En ninguno de los casos, tal como en el ejemplo anterior, se debe imprimir otras cabeceras previamente.

Adicionamente, se soportan parámetros nombrados en la invocación:

print $q->redirect(
 -url => 'http://example.com',
 -status => '301 Moved Permanently'
);

Es a través del parámetro -status que se puede establecer el estado de la redirección. El estado por defecto en perl, si no es especificado, es 302.

 

Estados posibles para la redirección

HTTP define los siguientes códigos de estado para la redirección

  • 301 Moved PermanentlyEsta petición y todas las siguientes se deben repetir con la url indicada
  • 302 FoundLa petición debe repetirse con otra url. Futuras peticiones deben seguir utilizando la url original.
    • Este estado ha sido reemplazado por 303 y 307:
      • HTTP/1.0 requería que el cliente realizara una redirección temporal (la frase original de la descripción era «Moved Temporarily») sin cambiar el método utilizado en la petición original. Pero muchos navegadores implementaron este código forzando el método de la nueva petición a GET, sin importar el utilizado en la petición original. Es un ejemplo de cuando la práctica de la industria termina contradiciendo el estándar.
      • HTTP/1.1 agregó nuevos códigos de estado a fin de distinguir ambos comportamientos: 303 para cambiar el método a GET y 307 para preservar el método originalmente usado.
      • Muchos frameworks y aplicaciones web lo siguen soportando para mantener la compatibilidad hacia atrás.
  • 303 See Other (desde HTTP/1.1)
    • La petición debe repetirse con otra url usando el método GET.
    • Cuando se recibe en respuesta a POST (o PUT/DELETE), el cliente debe asumir que el servidor ha recibido los datos y debe solicitar una petición GET a la url indicada
  • 307 Temporary Redirect (desde HTTP/1.1)
    • Esta petición debe repetirse con otra url. Futuras peticiones deben seguir utilizando la url original.
    • A diferencia de 302, no permite que cambie el método cuando se vuelve a realizar la petición.
  • 308 Permanent RedirectEsta petición y todas las siguientes se deben repetir con la url indicada
    • A diferencia de 301, no permite que cambie el método cuando se vuelve a realizar la petición.

Si bien es posible utilizar cualquier código de estado diferente a los especificados, probablemente se rompa la redirección. Notar también que la frase a continuación del código se espera también como parte del mismo.

OBS: los códigos 304, 305 y 306 existen pero no se utilizan para la redirección.

Configurar Apache para utilizar scripts CGI

Para poder invocar scripts CGI desde el navegador, es necesario configurar Apache de manera que lo permita. Para ello debemos seguir este sencillo instructivo:

Agregar Handler de CGI

Abrir en un editor de textos el archivo de configuración conf\httpd.conf ubicado dentro del directorio de instalación de Apache

Quitar el comentario de la línea (sólo borrando el # inicial) y guardar

#AddHandler cgi-script .cgi

Indicar la ejecución de CGIs en un VirtualHost

A partir de un VirtualHost que hayamos definido, según la versión de Apache:

  • Versión 2.0.x: En el mismo archivo de configuración (httpd.conf)
  • Versión 2.2.x: En el mismo archivo de configuración conf\extra\httpd-vhosts.conf

Agregar «+ExecCGI» a la cláusula Options dentro de Directory, manteniendo las preexistentes:

<VirtualHost *:80>
    ...
DocumentRoot SITE_PATH

    <Directory SITE_PATH>
        Options +ExecCGI +Indexes
    ...
    </Directory>
ServerName DOMINIO_LOCAL

    ...
</VirtualHost>

Adicionalmente sería conveniente agregar «index.cgi» a la cláusula DirectoryIndex del VirtualHost.

Reiniciar Apache

Procedemos a reiniciar el servicio de Apache para que tome la nueva configuración.

Probar el funcionamiento de CGI

Vamos a hacer la prueba ejecutando scripts CGI con Perl, por lo que requerimos que se encuentre instalado en el sistema. Tal vez tengamos que hacer unos ajustes adicionales para poder ejecutar scripts CGI con código Perl desde Apache en Windows.

En el directorio SITE_PATH correspondiente al VirtualHost, creamos un archivo llamado index.cgi con el siguiente contenido:

#!/usr/bin/perl

print "Content-type: text/html\n\n";

print "<h2>Configuraste correctamente apache para ejecutar scripts CGI con Perl</h2>";

Finalmente, abrimos un navegador y accedemos a la url DOMINIO_LOCAL del VirtualHost. Deberíamos ver el texto «Configuraste correctamente Apache para ejecutar scripts CGI con Perl«.