domingo, 30 de junio de 2013

Reglas de reescritura - Parte 3: Ejemplos completos

Vamos a ver varios ejemplos que combinan las distintas directivas vistas:

- Ejemplo 1: Permitir el acceso al area de administración solo desde la red local.

 RewriteEngine On  
 RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$  
 RewriteRule /admin - [F]  

De esta manera si la dirección que hace la petición al servidor, no coincide con el patrón, y la URI a la que intentamos acceder es /admin (área de administración) no redireccionaremos y mostraremos la página de error 403 (acceso prohibido).

- Ejemplo 2: Mostrar una página distinta dependiendo del navegador que estemos usando para realizar las peticiones al servidor.

 RewriteEngine On  
 RewriteCond %{HTTP_USER_AGENT} ^Mozilla  
 RewriteRule ^/$ /index.max.html [L]  
 RewriteCond %{HTTP_USER_AGENT} ^Lynx  
 RewriteRule ^/$ /index.min.html [L]  
 RewriteRule ^/$ /index.html [L]  

- Ejemplo 3:  Teníamos un fichero index.php que recibía un parámetro lang, para traducir el mensaje de bienvenida.  http://localhost/index.php?lang=es.  Pero actualmente se ha cambiado la forma de traducir del sitio web, y se han creado distintos directorios para cada idioma y dentro un index.php con el mensaje traducido. Por ejemplo http://localhost/es/index.php

Sin embargo se quiere seguir utilizando la misma forma de traducir.

 RewriteEngine On  
 RewriteCond %{QUERY_STRING} lang=(.*)  
 RewriteRule ^index\.php$ /%1/$1  

Con la variable de Apache {QUERY_STRING} guardamos la cadena de parámetros de una URL dinámica (query string). O dicho de otra manera lo que sigue al carácter "?". La variable %1 se refiere al contenido entre paréntesis de la directiva RewriteCond. Siguiendo el ejemplo sería "es". Y finalmente $1  se referirá a todo el conjunto que se corresponda con dicha expresión (index.php).

- Ejemplo 4: Añadir "www.", si es necesario, delante de una URL.

 RewriteEngine on  
 RewriteCond %{HTTP_HOST} !^www\. [NC]  
 RewriteCond %{HTTP_HOST} ^([a-z.]+)$ [NC]  
 RewriteRule ^/(.*)$ http://www.%1/$1 [R=301,L]  

Si la URL que introducimos no lleva www (primera RewriteCond) antes del host y el nombre de dicho host entra dentro del patrón (segunda RewriteCond) efectuaremos la reescritura. Con lo que si introducimos en el navegador la URL dominio.com/prueba se nos rediriguirá a www.dominio.com/prueba.
La variable %1 es el nombre del host. Capturado en la segunda RewriteCond y $1 es el contenido de la URL posterior al dominio. Capturado de RewriteRule

- Ejemplo 5: Queremos denegar el acceso a determinada hora del día (acceso prohibido).

 RewriteEngine On  
 RewriteBase /  
 # si hora es 16 (4 PM) denegar el acceso  
 RewriteCond %{TIME_HOUR} ^16$  
 RewriteRule ^.*$ - [F,L]  

- Ejemplo 6: Queremos evitar el uso de recursos sin permiso de tu servidor desde otra web (hot linking). Como podría ser el caso en que tengamos fotos alojadas en nuestro servidor y alguien, sin permiso, las publica en un sitio web ajeno. Por lo que vamos a denegar todas las peticiones de imágenes que sean de un dominio ajeno al tuyo (www.tudominio.com)

 RewriteEngine On  
 RewriteCond %{HTTP_REFERER} !^$  
 RewriteCond %{HTTP_REFERER} !^http://(www\.)?tudominio\.com/ [NC]  
 RewriteCond %{REQUEST_URI} !nohotlink\.(gif|png) [NC]  
 RewriteRule .*\.(gif|jpg|png|flv)$ http://www.tudominio.com/image/nohotlink.png [NC]  

Con la primera condición verificamos que el "http referer" no este vació. la variable HTTP_REFERER identifica la dirección de donde proviene la petición.
Con la segunda condición verificamos si la dirección de la petición no pertenece a nuestro dominio (www.tudominio.com).
Con la tercera condición verificamos si en la URI solicitada no se encuentra el nombre de la imagen a la que queremos redireccionar. Esta condición es necesaria para que no se produzca la redirección al intentar acceder a esta imagen.
La regla de reescritura indica que cualquier solicitud, cumpliendo las condiciones anteriores, de una imagen  será redirigida a una imagen en particular. Esta será la imagen que queremos que se muestre en las peticiones que intentan coger imágenes sin permiso.

- Ejemplo 7: Después de esta pequeña introducción ya seremos capaces de crear las reglas necesarias para nuestro objetivo inicial, reescribir URLs para que sean amigables.

 <IfModule mod_rewrite.c>  
      # Activar RewriteEngine  
      RewriteEngine on  
      RewriteBase /   
      RewriteCond %{SCRIPT_FILENAME} !-d  
      RewriteCond %{SCRIPT_FILENAME} !-f  
      # Reescribir la URL solicitada por el usuario  
      #  Entrada: ID  
      #  Salida: app.php?id=ID  
      RewriteRule ^([0-9]+)$ app.php?id=$1  
 </IfModule>  

El siguiente condicional sirve para comprobar que el módulo está cargado en la configuración de Apache antes de hacer nada.

 <IfModule mod_rewrite.c>   
 </IfModule>   

Luego hemos añadido “RewriteBase /” que indica que el directorio base es el raíz de host virtual.
Además hemos añadido dos condiciones para restringir la reescritura sólo a rutas que no existan previamente. Es decir, que no valdría realizar reescritura, por ejemplo, para www.dominio.com/img/img.png (suponemos que esta ruta y recurso existe). La primera condición previene los directorios que ya existan con la bandera !-d y la segunda hace que se ignoren ficheros que ya existan con la bandera !-f.
Luego, en la regla de reescritura, tenemos una entrada compuesta por números. La salida que ya conoce nuestro código PHP (aunque esto está oculto al usuario) es app.php?id=$1, siendo $1 el valor que ente los paréntesis.

- Ejemplo 8: En este ejemplo muy similar al anterior. Utilizamos cualquier carácter (no solo números) para redireccionar. Por lo tanto http://localhost/mvc/acl/permisos sera transformado internamente a http://localhost/index.php?url=acl/permisos para que lo entienda el servidor

  RewriteEngine on   
  RewriteBase /mvc/   
  RewriteCond %{REQUEST_FILENAME} !-d   
  RewriteCond %{REQUEST_FILENAME} !-f   
  RewriteCond %{REQUEST_FILENAME} !-l   
  RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]   


Entradas relacionadas

Reglas de reescritura - Parte 1: Introducción

No hay comentarios:

Publicar un comentario