- 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