Esta carateristica de apache viene determinada por un modulos dinámico llamado mod_rewrite que se carga con
LoadModule rewrite_module modules/mod_rewrite.so
|
que normalmente viene incluida en la configuración de apache.
Con mod_rewite podremos manipular las peticiones que se realicen la servidor web para redirigirlas a otras páginas o servidores basándonos en expresiones regulares. La reescritura hay que hacerla con cuidado para no crear bucles que sobrecarguen al servidor.
La configuración de mod_rewite se puede hacer en el fichero general de configuración (en los ficheros .conf) o en un fichero .htaccess.
Para activar mod_rewite en primer lugar tendremos que usar la directiva
RewriteEngine on
|
para activar el módulo. Para desactivarlo sólo tendríamos que poner
RewriteEngine off
|
y así el servidore ignora el resto de la configuración.
Se utiliza para indicar la URL base para la reedcritura, es decir qué peticiones debe interpretar el servidor, por ejemplo:
RewriteBase /
|
Se utiliza para especificar una condición que tiene que verificarse para realizar una modificación en la petición. La sintaxis es:
RewriteCond variable_apache expresión_regular bandera
|
donde variable_apache es una variable conocida por el servidor, por ejemplo, el nombre del navegador sería %{HTTP_USER_AGENT}. La expresión regular se utiliza para determinar cual es el valor de la variable que estamos analizando, por ejemplo si ponemos ^ia_archiver estaríamos indicando que el nombre del navegador comienza por ia_archiver. Por último las banderas, que van entre corchetesy, en su caso separadas por comas indican el comportamiento. Valores posibles son OR para indicar que se acumule con la siguiente condición, es decir que se verifique esta o la siguiente. El valor NC indica (no case) que no distinga mayúsculas de minúsculas.
Un ejemplo podría ser
RewriteCond %{HTTP_USER_AGENT} ^ia_archiver [OR,NC]
RewriteCond %{HTTP_USER_AGENT} ^Googlebot [NC]
|
Especifica una regla de reescritura, que tiene la siguiente sintaxis:
RewriteRule expresión_regular redireccion banderas
|
por ejemplo:
RewriteRule ^.*\.bak$ - [F]
|
Estaríamos diciendo que todas las páginas que termien en .bak no se redirigen (-) sin que se muestra el mensaje de página prohibida ([F] forbidden).
En general las banderas son unos indicadores que van entre corchetes y separados por comas si temenos más de uno. Valores posibles de las banders son:
R: (redirect) para forzar una redirección HTTP
F: (forbidden) para prohibir el acceso
G: (gone) para eliminar la URL
P: (proxy) para pasar la URL a mod_proxy.
L: (last) para detener el procesamiento.
N: (next) para continuar
C: (chain) para encadenar la regla activa con la siguiente
F: (type) para obligar un determinado tipo MIME.
NS: (nosubreq) para segurarse que la regla sólo se aplica si no se realizan subpeticiones internas.
NC: (nocase) para que la URL no distinga mayúsculas de minúsculas.
QSA: (qsappend) para añadir una nueva cadena de consulta (query string) en lugar de sustituirla.
PT: (passthrough) para asar la URL modificada a otro módulo apache.
S: (skip) para saltar la siguiente regla.
E: (env) para asignar una variable de entorno.
La directiva se puede aplicar dependiendo de unas directivas RewriteCond previas o aplicarse directamente, sin condiciones previas.
Ejemplo:
Supongamos que hemos cambiado el nombre de un directorio en el servidor pero sin embargo queremos que sigan funcionando las peticiones que llegan si que se produzca en mensaje 404 no encontrado:
RewriteRule ^/antiguo/.*$ /nuevo [R,L]
|
En la expresión regular y la sustitución podemos usar referencias. El primer paréntesis de la expresión regular se asigna a $1, el segundo paréntesis a $2, etc, por ejemplo:
RewriteRule ^(.*)/antiguo/(.*)$ /nuevo/$2/$1 [R,L]
|
Prohibir el acceso a un rango de IP:
Usamos la variable %{REMOTE_ADDR} que contiene la dirección desde donde se hace la consulta y usamos RewriteCond para comprobarla. A continuación con RewriteRule la prohibimos:
RewriteCond %{REMOTE_ADDR} ^80\.170\.26
RewriteRule ^.*$ - [F]
|
Redirigir todas peticiones de ficheros pdf al directorio documentos:
RewriteRule ^.*\.pdf$ documentos/ [L]
|
Evitar enlaces externos a imágenes en nuestro servidor:
RewriteCond %{HTTP_REFERER} !^http://(www\.)?dominio.dom.*$ [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|bmp)$ http://www.dominio.dom/noenlaces.gif [R,NC]
|
Con RewriteCond comprobamos que el enlace no provenga de nuestro dominio (observe el ! delante de la expresión). Entonces si el enlace no proviene del dominio redirige a una imagen genérica. También podríamos haber prohibido el acceso como en ejemplos anteriores.
Redirigir las peticiones del tipo ~usuario (de UserDir) a direcciones de la forma /u/usuario
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]
|