Versión 2.5 del Servidor HTTP Apache

Este documento complementa la mod_rewrite
documentación de referencia. Describe
quizás uno de los conceptos más importantes sobre mod_rewrite - concretamente,
cuándo evitar usarlo.
mod_rewrite debería considerarse como último recurso, cuando otras
alternativas resultan insuficientes. Usarlo cuando hay alternativas más simples
lleva a configuraciones que son confusas, frágiles y
difíciles de mantener. Entender qué otras alternativas están disponibles es
un paso muy importante hacia el dominio de mod_rewrite.
Tenga en cuenta que muchos de estos ejemplos no funcionarán sin cambios en su configuración particular del servidor, por lo que es importante que los entienda, en lugar de simplemente copiar y pegar los ejemplos en su configuración.
La situación más común en la que mod_rewrite es
la herramienta correcta es cuando la mejor solución requiere acceso a los
archivos de configuración del servidor, y usted no tiene ese acceso. Algunas
directivas de configuración solo están disponibles en el archivo de configuración
del servidor. Así que si está en una situación de alojamiento donde solo tiene archivos .htaccess
con los que trabajar, puede necesitar recurrir a
mod_rewrite.
mod_alias proporciona las directivas Redirect y RedirectMatch, que proporcionan un
medio para redirigir una URL a otra. Este tipo de redirección simple de
una URL, o una clase de URLs, a otro lugar, debería realizarse
usando estas directivas en lugar de RewriteRule. RedirectMatch
le permite incluir una expresión regular en sus criterios de redirección,
proporcionando muchos de los beneficios de usar RewriteRule.
Un uso común de RewriteRule es redirigir toda una
clase de URLs. Por ejemplo, todas las URLs en el directorio /one
deben ser redirigidas a http://one.example.com/, o quizás
todas las solicitudes http deben ser redirigidas a
https.
Estas situaciones se manejan mejor con la directiva Redirect.
Recuerde que Redirect preserva la información de
ruta. Es decir, una redirección para una URL /one también
redirigirá todas las URLs bajo ella, como /one/two.html
y /one/three/four.html.
Para redirigir URLs bajo /one a
http://one.example.com, haga lo siguiente:
Redirect "/one/" "http://one.example.com/"
Para redirigir un nombre de host a otro, por ejemplo
example.com a www.example.com, vea la
receta de Nombres de Host Canónicos.
Para redirigir URLs http a https, haga lo
siguiente:
<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... la configuración SSL va aquí
</VirtualHost>
El uso de RewriteRule para realizar esta tarea puede ser
apropiado si hay otras directivas RewriteRule en
el mismo ámbito. Esto se debe a que, cuando hay directivas Redirect
y RewriteRule en el mismo ámbito, las
directivas RewriteRule se ejecutarán primero, independientemente del
orden de aparición en el archivo de configuración.
En el caso de la redirección de http-a-https, el uso de
RewriteRule sería apropiado si no tiene acceso
al archivo de configuración principal del servidor, y está obligado a realizar esta
tarea en un archivo .htaccess en su lugar.
La directiva Alias
proporciona mapeo de un URI a un directorio - generalmente un directorio fuera
de su DocumentRoot. Aunque es
posible realizar este mapeo con mod_rewrite,
Alias es el método preferido, por
razones de simplicidad y rendimiento.
Alias "/cats" "/var/www/virtualhosts/felines/htdocs"
El uso de mod_rewrite para realizar este mapeo puede ser
apropiado cuando no tiene acceso a los archivos de configuración
del servidor. Alias solo puede usarse en contexto de servidor o virtualhost, y no
en un archivo .htaccess.
Los enlaces simbólicos serían otra forma de lograr lo mismo, si
tiene Options FollowSymLinks habilitado en su
servidor.
Aunque es posible manejar hosts virtuales
con mod_rewrite, rara vez es la forma correcta. Crear bloques
<VirtualHost> individuales es
casi siempre la forma correcta de proceder. En el
caso de que tenga un número enorme de hosts virtuales, considere usar
mod_vhost_alias para crear estos hosts automáticamente.
Módulos como mod_macro también son
útiles para crear un gran número de hosts virtuales dinámicamente.
Usar mod_rewrite para la creación de hosts virtuales puede ser
apropiado si está usando un servicio de alojamiento que no le proporciona
acceso a los archivos de configuración del servidor, y por lo tanto está
restringido a la configuración usando archivos .htaccess.
Vea el documento de hosts virtuales con mod_rewrite para más detalles sobre cómo podría lograr esto si aún parece ser el enfoque correcto.
RewriteRule proporciona la bandera [P] para pasar URIs reescritas a través de
mod_proxy.
RewriteRule "^/?images(.*)" "http://imageserver.local/images$1" [P]
Sin embargo, en muchos casos, cuando no hay necesidad real de coincidencia
de patrones, como en el ejemplo mostrado arriba, la directiva ProxyPass es una mejor opción.
El ejemplo aquí podría expresarse como:
ProxyPass "/images/" "http://imageserver.local/images/"
Tenga en cuenta que ya sea que use RewriteRule o ProxyPass, todavía necesitará usar la
directiva ProxyPassReverse para
capturar redirecciones emitidas por el servidor backend:
ProxyPassReverse "/images/" "http://imageserver.local/images/"
Puede necesitar usar RewriteRule en su lugar cuando hay
otras RewriteRules en efecto en el mismo ámbito, ya que una
RewriteRule generalmente tendrá efecto antes que un
ProxyPass, y por lo tanto puede anticiparse a lo que está intentando
lograr.
mod_rewrite se usa frecuentemente para tomar una acción particular
basada en la presencia o ausencia de una variable de entorno particular
o cabecera de solicitud. Esto puede hacerse de manera más eficiente usando la
directiva <If>.
Considere, por ejemplo, el escenario común donde
RewriteRule se usa para imponer un nombre de
host canónico, como www.example.com en lugar de
example.com. Esto puede hacerse usando la directiva <If>, como se muestra aquí:
<If "req('Host') != 'www.example.com'">
Redirect "/" "http://www.example.com/"
</If>
Esta técnica puede usarse para tomar acciones basadas en cualquier cabecera de
solicitud, cabecera de respuesta o variable de entorno, reemplazando
mod_rewrite en muchos escenarios comunes.
Vea especialmente la documentación de evaluación
de expresiones para una visión general de qué tipos de expresiones puede
usar en secciones <If>,
y en ciertas otras directivas.