En esta oportunidad voy a demostrar cómo recuperar valores de variables en una cookie HTTP, desde mod_rewrite, para rescribir URLs. Esto permite crear redirecciones basándose en un valor almacenado en una variable de la cookie con Apache.
Como probablemente la mayoría de los lectores sepan, las cookies HTTP son pequeñas porciones de datos enviados desde un servidor Web al cliente para mantener información relacionada a la sesión de navegación. Esto permite recordar accesos, mantener tickets y preferencias del usuario, seguir hábitos de navegación, etc.
Las cookies son transmitidas desde el servidor al cliente en formato de texto plano a través de la cabecera HTTP Set-Cookie
, y enviadas de vuelta al servidor (en cada subsiguiente solicitud) mediante la cabecera Cookie
. De esta forma, las cookies son mantenidas y almacenadas en disco en el lado cliente y como tal, son pasibles de ser manipuladas por el mismo. Con lo cual no es posible mantener información sensible a ser alterada en las mismas, como por ejemplo roles, privilegios, etc. Sin embargo son útiles para hacer seguimiento de hábitos de navegación, mantener preferencias del sitio, etc.
Al ser transmitidas en formato de texto plano, las cookies pueden mantener variables en un formato clave=valor
separados por punto y coma:
Cabe destacar, una vez más, que las cookies pueden ser manipuladas tanto por el usuario como por el navegador, el cual puede alterar el formato (agregar o eliminar espacios en blanco, alterar el orden en el que aparecen las variables, etc.)
Yendo al punto del artículo, y luego de esta breve introducción a las cookies y su funcionamiento, el problema es el siguiente: al acceder a cierto recurso de nuestro sitio Web, se requiere implementar una redirección (respuesta HTTP 302) hacia una URL que se debe confeccionar en base al valor de una variable en la cookie de la sesión actual.
Apache permite acceder al valor de una cookie a través de la variable de entorno HTTP_COOKIE
. Sin embargo el problema no es tan sencillo, pues esta variable mantiene todo el contenido de la cookie en texto plano, lo que implica que es necesario parsear la cookie para extraer el valor de la variable buscada. Afortunadamente es posible lograrlo utilizando expresiones regulares.
Veamos directamente un ejemplo: para cada sesión se almacena el nombre de usuario en una cookie dentro de la variable "usuario":
usuario=emiliano
Se necesita que, al acceder al recurso "/configuracion", el usuario sea redirigido hacia "/perfil/emiliano". Extrayendo efectivamente el nombre de usuario desde la cookie. Se necesita entonces extraer desde la cookie la porción de texto desde "usuario=" hasta encontrar un punto y coma:
# Redirigir hacia /perfil/[usuario] si está definido en la cookie RewriteCond %{HTTP_HOST} ^www\.linuxito\.com$ RewriteCond %{REQUEST_URI} ^/configuracion RewriteCond %{HTTP_COOKIE} usuario=([^;]+) [NC] RewriteRule ^/(.*)$ /perfil/%1 [R=302,L,NS,QSA]
La primera condición evalúa el nombre de dominio. Esto es necesario si el servidor Apache trabaja con más de un dominio. La segunda condición evalúa que se esté accediendo al recurso "/configuracion". La tercera condición es donde ocurre la "magia. Esta última condición se encarga de extraer desde la cookie el patrón, o porción de texto, desde la cadena "usuario=" hasta el siguiente punto y coma (";"). Por si acaso se indica que esta regla no sea case sensitive ([NC]
). Sólo por si algún cliente o navegador cambia el case (mayúsculas) del nombre de la variable.
Por último viene la regla de rescritura en sí: se cambia el recurso actual hacia "/perfil/" concatenado con el patrón extraído en la condición anterior (%1
). Esto es precisamente el valor de la variable usuario
en la cookie.
Es importante aclarar que si el navegador no ha enviado una cookie, o si la cookie no posee dicha variable, la condición falla y no se ejecuta la regla de rescritura. En tal caso, si fuera necesario tomar una acción ante esta situación, es posible agregar una regla adicional que verifique la existencia tanto de la cookie como de la variable "usuario":
# Redirigir a /login si no hay cookie o no se encuentra la variable "usuario" RewriteCond %{HTTP_HOST} ^www\.linuxito\.com$ RewriteCond %{REQUEST_URI} ^/configuracion RewriteCond %{HTTP_COOKIE} !usuario=([^;]+) [NC] RewriteRule ^/(.*)$ /login [R=302,L,NS,QSA]
Referencias
- .htaccess Examples: Cookies, Variables, Custom Headers
- Apache Module mod_rewrite
- Rewrite Conditions
- HTTP headers
- Set-Cookie
- HTTP cookies