Restringir acceso a una web con usuario y dirección IP usando .htaccess

Septiembre 4, 2008

Esta es una pequeña nota de un problema con el que me he topado el dia de hoy y antes de ponerme a duplicar páginas o a inventarme algunas lineas de código en PHP para restringir el acceso decidí investigar un poco como configurar el .htaccess para poder restringir el acceso a un directorio web y me encontre con una solucion fácil y sencilla.

La situación era esta. Necesitaba restringir el acceso a un directorio web de manera que si alguien accede a la URL desde la IP de la oficina le permita el acceso transparente, y si el acceso se realiza desde cualquiera de las IP no autorizada que solicite un usuario y una contraseña para poder acceder al contenido. Para poder lograr esta configuración el archivo .htaccess debe de estar alojado en la raíz del directorio que queremos (en este enlace encontraras más información sobre como habilitar el .htaccess)

El archivo .htacces queda de la siguiente forma:


AuthUserFile /var/www/website/subdir/.htpasswd
AuthName "Protected Site"
AuthType Basic
Require user usuario1 usuario2
Order allow,deny
Allow from xx.xx.xx.xx
Satisfy any

El truco esta en la instrucción “Satisfy any” que basicamente lo que hace es permitir el acceso al subdirectorio si se cumple al menos una de las condiciones que exigimos en el archivo .htaccess. Yo personalmente no lo conocía pero navegando un poco encontre la solución y la dejo aquí por si a alguien le hace falta o para futuras referencias propias, que siempre se me olvida como hacer este tipo de cosas.

(Howto restrict access to a website by IP and username using .htaccess)

¿Qué son las Rewrite Rules?

Abril 14, 2008

Son un conjunto de reglas que se valen de expresiones regulares para poder reescribir solicitudes de direcciones URL “on the fly” y de forma transparente. Son parte del módulo de Apache mod_rewrite y soportan un número ilimitado de condiciones utilizando variables e inclusio los “headers” HTTP para cambios avanzados de las direcciones URL.

En palabras más claras nos permiten reescribir la dirección URL utilizando patrones fáciles de entender para los humanos y haciendolos fáciles de indexar y convertirlos a peticiones que nuestra programación pueda entender. Este módulo es comunmente utilizado para poder usar las denominadas “Clean URL’s” (URL limpias) para hacerlas más lógicas, un ejemplo sería cuando el usuario ve esta URL http://www.dominio.com/buscar/termino y el mod_rewrite se encarga de convertir esa URL en http://www.dominio.com/cgi-bin/buscar.cgi?term=termino.

De esta forma para el usuario es fácil recordar esa URL ya que mantiene una sintaxis más clara de entender. Esta no pretende ser una guía muy extensa del mod_rewrite, si quieres ampliar información puedes verla en la Wikipedia y el sitio de Apache, así como las directivas de configuración.

Algunos usos prácticos de las rewrite rules

  • Permitir que las direcciones URL sean más amigables al usuario y los buscadores.
  • Prevenir el “hot linking” o que usen tus imagenes en otros sitios.
  • Esconder las direcciones web reales de tu servidor a los usuarios.
  • Redirigir de forma transparente las peticiones web.

Es una herramienta muy potente, y nos da muchísimas posibilidades de juego a costa de un pequeño incremento en la carga de procesamiento en el servidor, por lo que no es aconsejable el uso excesivo de estas.

Para habilitarlas es aconsejable hacerlo desde la raíz del servidor web, creando un archivo .htaccess con las siguientes cabeceras

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

Abajo de estas líneas ya pueden empezar a detallarse las reglas que necesitemos configurar.

Desde hace algún tiempo he estado utilizando estas herramientas y me han ayudado a mejorar mi sitio web, son muy fáciles de usar si tienes un mínimo conocimiento de expresiones regulares y de las cabeceras del Apache. Así que me gustaría explicar algunos problemas que me encontre y como los hemos resuelto usando las rewrite rules:

Rewrite rules para el uso de “Clean URL’s”

RewriteRule ^user/(.*)$ /mt/mt-cp.cgi?username=$1 [L]

Esta regla lo que hace es buscar la palabra user seguida de una “/” desde el inicio de linea, es decir, el primer caracter despues del dominio, por ejemplo

http://www.dominio.com/user/edeleon

Si la encuentra reenvía la petición al servidor Apache de la siguiente forma

http://www.dominio.com/mt/mt-cp.cgi?username=edeleon

Y el servidor devuelve al usuario la página sin cambiar la URL en el navegador del usuario. Al usar el flag [L] le decimos al mod_rewrite que esa es la última regla evitando así que las siguientes reglas puedan cambiar el resultado de la petición.

Rewrite rules para el uso de “Clean URL’s” utilizando los “headers HTTP”

RewriteCond %{HTTP_REFERER} www [OR]
RewriteCond %{HTTP_REFERER} docs
RewriteCond %{REQUEST_URI} /user/(.*[^/])
RewriteRule ^user/(.*)$ /mt/mt-cp.cgi?username=$1 [L]

En esta ocasión utilizamos el RewriteCond para condicionar la regla de tal forma que preguntamos si la petición viene de un sitio que contenga www O docs en el dominio Y si la URL contiene /user/ seguida de cualquier caracter que utilice el patrón de RewriteRule para reescribir la petición. Ojo a la forma de utilizar [OR] para que el operador acepte una condicion u otra, y si no lo usamos usa el operador “and” por defecto.

Rewrite Rule para redirigir la petición a otra URL

RewriteRule ^categoria/(.*)$ /category/$1 [R]

Esta regla es útil cuando necesitamos redirigir al usuario a una nueva URL, al usar el “flag” [R] estamos diciendo al mod_rewrite que fuerze la redirección, cambiando la URL en la barra del navegador del usuario y pasando todo el texto despues de “/” como parámetro a la nueva URL.

otra forma de hacer un redirect de forma fácil sería

Redirect permanent /rss/comentarios.xml http://feeds.feedburner.com/my_feef_url

Este ejemplo es práctico si usamos por ejemplo a feedburner como proveedor de nuestros RSS, al usar la directiva Redirect hacemos una redirección del tipo permanente a la nueva URL. De manera que podemos seguir usando nuestras propias direcciones para que los usuarios se subscriban y de ser necesario cambiarlas en el futuro poder hacerlo de forma transparente para el usuario y asi evitar links rotos.

Otros usos de las rewrite rules podrían ser redirigir a los usuarios dependiendo del lenguaje del navegador a la versión específica de nuestro sitio web más adecuada. O verificar el tipo de navegador y si detectamos que es un móvil poder enviar al usuario a la versión móvil de nuestro sitio web. Las posibilidades son infitinas, y espero poder ir contando otras formas curiosas para usar las rewrite rules.