Versión 2.5 del Servidor HTTP Apache

Este documento describe las banderas que están disponibles para la
directiva RewriteRule,
proporcionando explicaciones detalladas y ejemplos.
Introducción
B (escapar referencias inversas)
BNP|backrefnoplus (no escapar espacio a +)
BCTLS
BNE
C|chain
CO|cookie
DPI|discardpath
E|env
END
F|forbidden
G|gone
H|handler
L|last
N|next
NC|nocase
NE|noescape
NS|nosubreq
P|proxy
PT|passthrough
QSA|qsappend
QSD|qsdiscard
QSL|qslast
R|redirect
S|skip
T|type
UnsafeAllow3F
UnsafePrefixStat
UNCUna RewriteRule puede tener
su comportamiento modificado por una o más banderas. Las banderas se incluyen entre
corchetes al final de la regla, y múltiples banderas se separan
con comas.
RewriteRule pattern target [Flag1,Flag2,Flag3]
Cada bandera (con algunas excepciones) tiene una forma corta, como
CO, así como una forma más larga, como cookie.
Aunque es más común usar
la forma corta, se recomienda que se familiarice con la
forma larga, para que recuerde qué se supone que hace cada bandera.
Algunas banderas toman uno o más argumentos. Las banderas no distinguen entre mayúsculas y minúsculas.
Las banderas que alteran metadatos asociados con la solicitud (T=, H=, E=) no tienen efecto en contexto per-directorio y htaccess, cuando una sustitución (distinta de '-') se realiza durante la misma ronda de procesamiento de reescritura.
Aquí se presentan cada una de las banderas disponibles, junto con un ejemplo de cómo podría usarlas.
La bandera [B] indica a RewriteRule que escape los caracteres no alfanuméricos
antes de aplicar la transformación.
mod_rewrite tiene que desescapar URLs antes de mapearlas,
por lo que las referencias inversas se desescapan en el momento en que se aplican.
Usando la bandera B, los caracteres no alfanuméricos en las referencias inversas
se escaparán. Por ejemplo, considere la regla:
Para un escape similar de variables del servidor, vea la función de mapeo "escape"
RewriteRule "^search/(.*)$" "/search.php?term=$1"
Dado un término de búsqueda de 'x & y/z', un navegador lo codificará como
'x%20%26%20y%2Fz', haciendo la solicitud 'search/x%20%26%20y%2Fz'. Sin la bandera B,
esta regla de reescritura mapeará a 'search.php?term=x & y/z', que
no es una URL válida, y por lo tanto sería codificada como
search.php?term=x%20&y%2Fz=, que no era lo que se pretendía.
Con la bandera B establecida en esta misma regla, los parámetros se re-codifican
antes de pasarse a la URL de salida, resultando en un mapeo correcto a
/search.php?term=x%20%26%20y%2Fz.
RewriteRule "^search/(.*)$" "/search.php?term=$1" [B,PT]
Tenga en cuenta que también puede necesitar establecer AllowEncodedSlashes a On para que este
ejemplo particular funcione, ya que httpd no permite barras codificadas en URLs, y
devuelve un 404 si ve una.
Este escape es particularmente necesario en una situación de proxy, cuando el backend puede fallar si se le presenta una URL sin escapar.
Una alternativa a esta bandera es usar una RewriteCond para capturar contra %{THE_REQUEST} que capturará
cadenas en la forma codificada.
En 2.4.26 y posterior, puede limitar el escape a caracteres específicos
en las referencias inversas listándolos: [B=#?;]. Nota: El carácter
de espacio puede usarse en la lista de caracteres a escapar, pero debe entrecomillar
el tercer argumento completo de RewriteRule
y el espacio no debe ser el último carácter en la lista.
# Escapar espacios y signos de interrogación. Las comillas alrededor del argumento final # son necesarias cuando se incluye un espacio. RewriteRule "^search/(.*)$" "/search.php?term=$1" "[B= ?]"
Para limitar los caracteres escapados de esta manera, vea #flag_bne y #flag_bctls
La bandera [BNP] indica a RewriteRule que escape el carácter de espacio
en una referencia inversa a %20 en lugar de '+'. Útil cuando la referencia inversa
se usará en el componente de ruta en lugar de la cadena de consulta.
# Escapar espacios a %20 en la ruta en lugar de + como se usa en el envío de formularios a través de # la cadena de consulta RewriteRule "^search/(.*)$" "/search.php/$1" "[B,BNP]"
Esta bandera está disponible en la versión 2.4.26 y posterior.
La bandera [BCTLS] es similar a la bandera [B], pero solo escapa caracteres de control y el carácter de espacio. Este es el mismo conjunto de caracteres rechazados cuando se copian en la cadena de consulta sin codificar.
# Escapar caracteres de control y espacios RewriteRule "^search/(.*)$" "/search.php/$1" "[BCTLS]"
Esta bandera está disponible en la versión 2.5.1 y posterior.
La lista de caracteres en [BNE=...] se trata como exclusiones de los caracteres de las banderas [B] o [BCTLS]. Los caracteres listados no serán escapados.
# Escapar los caracteres predeterminados, pero dejar / RewriteRule "^search/(.*)$" "/search.php?term=$1" "[B,BNE=/]"
Esta bandera está disponible en la versión 2.5.1 y posterior.
La bandera [C] o [chain] indica que la RewriteRule está encadenada a la siguiente
regla. Es decir, si la regla coincide, entonces se procesa como de costumbre y
el control pasa a la siguiente regla. Sin embargo, si no coincide, entonces
la siguiente regla, y cualquier otra regla que esté encadenada, se
omiten.
La bandera [CO], o [cookie], le permite establecer una cookie cuando una
RewriteRule particular
coincide. El argumento consiste en tres campos obligatorios y cinco
campos opcionales.
La sintaxis completa para la bandera, incluyendo todos los atributos, es la siguiente:
[CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly:samesite]
Si se necesita un carácter literal ':' en cualquiera de los campos de la cookie, está disponible una sintaxis alternativa. Para optar por la sintaxis alternativa, el "Name" de la cookie debe ir precedido por un carácter ';', y los separadores de campo deben especificarse como ';'.
[CO=;NAME;VALUE:MOREVALUE;DOMAIN;lifetime;path;secure;httponly;samesite]
Debe declarar un nombre, un valor y un dominio para que la cookie se establezca.
www.example.com, o puede ser un dominio,
como .example.com. Debe tener al menos dos partes
separadas por un punto. Es decir, no puede ser simplemente .com o
.net. Las cookies de ese tipo están prohibidas por el modelo de
seguridad de cookies.Opcionalmente también puede establecer los siguientes valores:
/customers/ o /files/download/./ - es decir, todo el
sitio web.secure, true, o 1,
la cookie solo se permitirá ser transmitida a través de conexiones seguras (https).HttpOnly, true, o
1, la cookie tendrá la bandera HttpOnly establecida,
lo que significa que la cookie es inaccesible para código JavaScript en
navegadores que soportan esta característica.false o 0, el atributo SameSite
se establece al valor especificado. Valores típicos son None,
Lax, y Strict. Disponible en 2.5.1 y posterior.Considere este ejemplo:
RewriteEngine On RewriteRule "^/index\.html" "-" [CO=frontdoor:yes:.example.com:1440:/]
En el ejemplo dado, la regla no reescribe la solicitud.
El destino de reescritura "-" le dice a mod_rewrite que pase la solicitud
sin cambios. En su lugar, establece una cookie
llamada 'frontdoor' con un valor de 'yes'. La cookie es válida para cualquier host
en el dominio .example.com. Se establece para expirar en 1440
minutos (24 horas) y se devuelve para todas las URIs.
La bandera DPI causa que la porción PATH_INFO de la URI reescrita sea descartada.
Esta bandera está disponible en la versión 2.2.12 y posterior.
En contexto per-directorio, la URI contra la que cada RewriteRule
compara es la concatenación de los valores actuales de la URI
y PATH_INFO.
La URI actual puede ser la URI inicial solicitada por el cliente, el
resultado de una ronda anterior de procesamiento de mod_rewrite, o el resultado de
una regla previa en la ronda actual de procesamiento de mod_rewrite.
En contraste, el PATH_INFO que se añade a la URI antes de cada
regla refleja solo el valor de PATH_INFO antes de esta ronda de
procesamiento de mod_rewrite. Como consecuencia, si porciones grandes
de la URI se hacen coincidir y copian en una sustitución en múltiples
directivas RewriteRule, sin considerar
qué partes de la URI provienen del PATH_INFO actual, la URI
final puede tener múltiples copias de PATH_INFO añadidas.
Use esta bandera en cualquier sustitución donde el PATH_INFO que resultó
del mapeo anterior de esta solicitud al sistema de archivos no es de
interés. Esta bandera olvida permanentemente el PATH_INFO establecido
antes de que comenzara esta ronda de procesamiento de mod_rewrite. PATH_INFO no
se recalculará hasta que se complete la ronda actual de procesamiento de mod_rewrite.
Las reglas subsiguientes durante esta ronda de procesamiento verán
solo el resultado directo de las sustituciones, sin ningún PATH_INFO
añadido.
Con la bandera [E], o [env], puede establecer el valor de una variable de entorno. Tenga en cuenta que algunas variables de entorno pueden establecerse después de que la regla se ejecute, deshaciendo así lo que ha establecido. Vea el documento de Variables de Entorno para más detalles sobre cómo funcionan las variables de entorno.
La sintaxis completa para esta bandera es:
[E=VAR:VAL] [E=!VAR]
VAL puede contener referencias inversas ($N o
%N) que se expanden.
Usando la forma corta
[E=VAR]
puede establecer la variable de entorno llamada VAR a un
valor vacío.
La forma
[E=!VAR]
permite eliminar una variable de entorno previamente establecida
llamada VAR.
Las variables de entorno pueden usarse en una variedad de contextos, incluyendo programas CGI, otras directivas RewriteRule, o directivas CustomLog.
El siguiente ejemplo establece una variable de entorno llamada 'image' con un valor de '1' si la URI solicitada es un archivo de imagen. Entonces, esa variable de entorno se usa para excluir esas solicitudes del registro de acceso.
RewriteRule "\.(png|gif|jpg)$" "-" [E=image:1] CustomLog "logs/access_log" combined env=!image
Tenga en cuenta que este mismo efecto se puede obtener usando SetEnvIf. Esta técnica se ofrece como
un ejemplo, no como una recomendación.
Usar la bandera [END] termina no solo la ronda actual de procesamiento de reescritura (como [L]) sino también previene que cualquier procesamiento de reescritura posterior ocurra en contexto per-directorio (htaccess).
Esto no se aplica a nuevas solicitudes resultantes de redirecciones externas.
Usar la bandera [F] causa que el servidor devuelva un código de estado 403 Forbidden
al cliente. Aunque el mismo comportamiento puede lograrse usando
la directiva Deny, esto
permite más flexibilidad en la asignación de un estado Forbidden.
La siguiente regla prohibirá que archivos .exe sean
descargados de su servidor.
RewriteRule "\.exe" "-" [F]
Este ejemplo usa la sintaxis "-" para el destino de reescritura, que significa que la URI solicitada no se modifica. No hay razón para reescribir a otra URI, si va a prohibir la solicitud.
Cuando se usa [F], se implica un [L] - es decir, la respuesta se devuelve inmediatamente, y no se evalúan más reglas.
La bandera [G] fuerza al servidor a devolver un estado 410 Gone con la respuesta. Esto indica que un recurso solía estar disponible, pero ya no lo está.
Como con la bandera [F], normalmente usará la sintaxis "-" para el destino de reescritura cuando use la bandera [G]:
RewriteRule "oldproduct" "-" [G,NC]
Cuando se usa [G], se implica un [L] - es decir, la respuesta se devuelve inmediatamente, y no se evalúan más reglas.
Fuerza que la solicitud resultante sea manejada con el manejador especificado. Por ejemplo, uno podría usar esto para forzar que todos los archivos sin extensión de archivo sean procesados por el manejador de php:
RewriteRule "!\." "-" [H=application/x-httpd-php]
La expresión regular anterior - !\. - coincidirá con cualquier solicitud
que no contenga el carácter literal ..
Esto también puede usarse para forzar el manejador basado en algunas condiciones.
Por ejemplo, el siguiente fragmento usado en contexto per-servidor permite que
archivos .php sean mostrados por mod_php
si se solicitan con la extensión .phps:
RewriteRule "^(/source/.+\.php)s$" "$1" [H=application/x-httpd-php-source]
La expresión regular anterior - ^(/source/.+\.php)s$ - coincidirá
con cualquier solicitud que comience con /source/ seguido de 1 o
más caracteres seguidos de .phps literalmente. La referencia inversa
$1 se refiere a la coincidencia capturada dentro de los paréntesis de la expresión
regular.
La bandera [L] causa que mod_rewrite deje de procesar
el conjunto de reglas. En la mayoría de los contextos, esto significa que si la regla coincide, no
se procesarán más reglas. Esto corresponde al
comando last en Perl, o al comando break en
C. Use esta bandera para indicar que la regla actual debe aplicarse
inmediatamente sin considerar más reglas.
Si está usando RewriteRule en archivos
.htaccess o en
secciones <Directory>,
es importante entender cómo se procesan las reglas. La forma simplificada de esto es que una vez que las reglas han sido
procesadas, la solicitud reescrita se devuelve al motor de análisis
de URL para que haga lo que pueda con ella. Es posible que mientras se maneja la solicitud reescrita, el archivo .htaccess o
la sección <Directory>
pueda encontrarse de nuevo, y así el conjunto de reglas pueda ejecutarse de nuevo desde el
inicio. Lo más común es que esto suceda si una de las reglas causa una
redirección - ya sea interna o externa - causando que el proceso de solicitud
comience de nuevo.
Es por lo tanto importante, si está usando directivas RewriteRule en uno de estos
contextos, que tome pasos explícitos para evitar bucles en las reglas, y no
contar únicamente con la bandera [L] para terminar la ejecución de una serie de
reglas, como se muestra a continuación.
Una bandera alternativa, [END], puede usarse para terminar no solo la ronda actual de procesamiento de reescritura sino prevenir cualquier procesamiento de reescritura posterior en contexto per-directorio (htaccess). Esto no se aplica a nuevas solicitudes resultantes de redirecciones externas.
El ejemplo dado aquí reescribirá cualquier solicitud a
index.php, dando la solicitud original como un argumento de cadena
de consulta a index.php, sin embargo, la RewriteCond asegura que si la solicitud
ya es para index.php, la RewriteRule se omitirá.
RewriteBase "/"
RewriteCond "%{REQUEST_URI}" !=/index.php
RewriteRule "^(.*)" "/index.php?req=$1" [L,PT]
La bandera [N] causa que el conjunto de reglas comience de nuevo desde el principio, usando el resultado del conjunto de reglas hasta el momento como punto de partida. Use con extrema precaución, ya que puede resultar en un bucle.
La bandera [Next] podría usarse, por ejemplo, si deseara reemplazar una cierta cadena o letra repetidamente en una solicitud. El ejemplo mostrado aquí reemplazará A con B en todas partes de una solicitud, y continuará haciéndolo hasta que no haya más As por reemplazar.
RewriteRule "(.*)A(.*)" "$1B$2" [N]
Puede pensar en esto como un bucle while: Mientras este
patrón siga coincidiendo (es decir, mientras la URI aún contenga una
A), realice esta sustitución (es decir, reemplace la
A con una B).
En 2.5.0 y posterior, este módulo devuelve un error después de 10,000 iteraciones para proteger contra bucles no intencionados. Se puede especificar un número máximo alternativo de iteraciones añadiéndolo a la bandera N.
# Estar dispuesto a reemplazar 1 carácter en cada pasada del bucle RewriteRule "(.+)[><;]$" "$1" [N=32000] # ... o, rendirse después de 10 bucles RewriteRule "(.+)[><;]$" "$1" [N=10]
El uso de la bandera [NC] causa que la RewriteRule se evalúe de manera
insensible a mayúsculas/minúsculas. Es decir, no importa si las letras aparecen
en mayúsculas o minúsculas en la URI coincidente.
En el ejemplo siguiente, cualquier solicitud de un archivo de imagen será proxied
a su servidor de imágenes dedicado. La coincidencia es insensible a mayúsculas/minúsculas, de modo que
archivos .jpg y .JPG son ambos aceptables, por
ejemplo.
RewriteRule "(.*\.(jpg|gif|png))$" "http://images.example.com$1" [P,NC]
Por defecto, cuando una RewriteRule
resulta en una redirección externa, cualquier carácter en la salida que no esté
en el siguiente conjunto seguro será convertido a sus equivalentes en hexadecimal
(codificación porcentual):
A-Z, a-z,
0-9$-_.+!*'(),:;@&=/~Por ejemplo, # se convertiría a %23,
y ? a %3F. El carácter %
también se escapa (a %25), lo que significa que cualquier
codificación porcentual ya presente en la sustitución será
doblemente codificada.
Usar la bandera [NE] previene este escape, permitiendo que caracteres
como # y ? pasen a la
URL de redirección sin modificar.
RewriteRule "^/anchor/(.+)" "/bigpage.html#$1" [NE,R]
El ejemplo anterior redirigirá /anchor/xyz a
/bigpage.html#xyz. Omitir la [NE] resultará en que el #
sea convertido a su equivalente hexadecimal, %23, lo que
entonces resultará en una condición de error 404 No Encontrado.
El uso de la bandera [NS] previene que la regla se use en
sub-solicitudes. Por ejemplo, una página incluida usando un SSI (Server
Side Include) es una sub-solicitud, y usted puede querer evitar que las reescrituras
ocurran en esas sub-solicitudes. También, cuando mod_dir
intenta encontrar información sobre posibles archivos predeterminados de directorio
(como archivos index.html), esto es una
sub-solicitud interna, y a menudo querrá evitar reescrituras en tales sub-solicitudes.
En sub-solicitudes, no siempre es útil, e incluso puede causar errores, si
el conjunto completo de reglas se aplica. Use esta bandera para excluir
reglas problemáticas.
Para decidir si usar o no esta regla: si prefija URLs con scripts CGI, para forzar que sean procesadas por el script CGI, es probable que tenga problemas (o una sobrecarga significativa) en sub-solicitudes. En estos casos, use esta bandera.
Imágenes, archivos javascript, o archivos css, cargados como parte de una página HTML, no son sub-solicitudes - el navegador los solicita como solicitudes HTTP separadas.
El uso de la bandera [P] causa que la solicitud sea manejada por
mod_proxy, y procesada a través de una solicitud proxy. Por
ejemplo, si quisiera que todas las solicitudes de imágenes fueran manejadas por un servidor
de imágenes backend, podría hacer algo como lo siguiente:
RewriteRule "/(.*)\.(jpg|gif|png)$" "http://images.example.com/$1.$2" [P]
El uso de la bandera [P] implica [L] - es decir, la solicitud se envía inmediatamente a través del proxy, y cualquier regla siguiente no será considerada.
Debe asegurarse de que la cadena de sustitución sea una URI válida
(típicamente comenzando con http://hostname) que pueda ser
manejada por mod_proxy. Si no, obtendrá un
error del módulo proxy. Use esta bandera para lograr una
implementación más potente de la directiva ProxyPass,
para mapear contenido remoto al espacio de nombres del servidor local.
Tenga cuidado al construir la URL destino de la regla, considerando el impacto de seguridad de permitir que el cliente influya en el conjunto de URLs a las que su servidor actuará como proxy. Asegúrese de que la parte del esquema y nombre de host de la URL sea fija, o no permita al cliente una influencia indebida.
Usar esta bandera provoca el uso de mod_proxy, sin
manejo de conexiones persistentes ya que se usa el worker predeterminado en este caso,
el cual no maneja agrupación/reutilización de conexiones.
Para usar conexiones persistentes necesita configurar un
bloque Proxy al menos para la parte del esquema
y host de la URL destino conteniendo una
directiva ProxySet donde por ejemplo establezca
un timeout.
Si lo configura con ProxyPass o
ProxyPassMatch se usarán conexiones
persistentes automáticamente.
Nota: mod_proxy debe estar habilitado para
usar esta bandera.
El destino (o cadena de sustitución) en una RewriteRule se asume que es una
ruta de archivo, por defecto. El uso de la bandera [PT] causa que sea tratada
como una URI en su lugar. Es decir, el
uso de la bandera [PT] causa que el resultado de la RewriteRule se pase de vuelta a través del
mapeo de URL, de modo que mapeos basados en ubicación, como Alias, Redirect, o ScriptAlias, por ejemplo, puedan tener la
oportunidad de tomar efecto.
Si, por ejemplo, tiene un
Alias
para /icons, y tiene una RewriteRule apuntando allí, debería
usar la bandera [PT] para asegurar que el
Alias sea evaluado.
Alias "/icons" "/usr/local/apache/icons" RewriteRule "/pics/(.+)\.jpg$" "/icons/$1.gif" [PT]
La omisión de la bandera [PT] en este caso causará que el Alias sea ignorado, resultando en un error 'Archivo no encontrado'.
La bandera PT implica la bandera L:
la reescritura se detendrá para pasar la solicitud a
la siguiente fase de procesamiento.
Tenga en cuenta que la bandera PT está implícita en contextos per-directorio
como secciones
<Directory>
o en archivos .htaccess. La única forma de evitar eso
es reescribir a -.
Cuando la URI de reemplazo contiene una cadena de consulta, el comportamiento predeterminado
de RewriteRule es descartar
la cadena de consulta existente, y reemplazarla con la recién generada.
Usar la bandera [QSA] causa que las cadenas de consulta se combinen.
Considere la siguiente regla:
RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]
Con la bandera [QSA], una solicitud para /pages/123?one=two será
mapeada a /page.php?page=123&one=two. Sin la bandera [QSA],
esa misma solicitud será mapeada a
/page.php?page=123 - es decir, la cadena de consulta existente
será descartada.
Cuando la URI solicitada contiene una cadena de consulta, y la URI destino no
la contiene, el comportamiento predeterminado de RewriteRule es copiar esa cadena de consulta
a la URI destino. Usar la bandera [QSD] causa que la cadena de consulta
sea descartada.
Esta bandera está disponible en la versión 2.4.0 y posterior.
Usar [QSD] y [QSA] juntos resultará en que [QSD] tenga precedencia.
Si la URI destino tiene una cadena de consulta, se observará el comportamiento predeterminado
- es decir, la cadena de consulta original será descartada y
reemplazada con la cadena de consulta en la URI destino de la RewriteRule.
Por defecto, el primer signo de interrogación (el más a la izquierda) en la sustitución
delimita la ruta de la cadena de consulta. Usar la bandera [QSL] indica a
RewriteRule que en su lugar divida
los dos componentes usando el último signo de interrogación (el más a la derecha).
Esto es útil cuando se mapea a archivos que tienen signos de interrogación literales en sus nombres de archivo. Si no se usa cadena de consulta en la sustitución, se puede añadir un signo de interrogación en combinación con esta bandera.
Esta bandera está disponible en la versión 2.4.19 y posterior.
El uso de la bandera [R] causa que se emita una redirección HTTP al navegador.
Si se especifica una URL completamente cualificada (es decir, incluyendo
http://servername/) entonces se emitirá una redirección a esa
ubicación. De lo contrario, se usará el protocolo actual, nombre del servidor, y número de puerto
para generar la URL enviada con la redirección.
Se puede especificar cualquier código de estado de respuesta HTTP válido,
usando la sintaxis [R=305], con un código de estado 302 siendo usado por
defecto si no se especifica ninguno. El código de estado especificado no necesita
necesariamente ser un código de estado de redirección (3xx). Sin embargo,
si un código de estado está fuera del rango de redirección (300-399) entonces la
cadena de sustitución se descarta por completo, y la reescritura se detiene como si
se usara L.
Además de los códigos de estado de respuesta, también puede especificar estados de
redirección usando sus nombres simbólicos: temp (predeterminado),
permanent, o seeother.
Casi siempre querrá usar [R] junto con [L] (es decir,
usar [R,L]) porque por sí sola, la bandera [R] antepone
http://thishost[:thisport] a la URI, pero luego pasa esto
a la siguiente regla en el conjunto de reglas, lo que a menudo puede resultar en advertencias de 'URI
inválida en solicitud'.
Nota: httpd solo soporta códigos de estado que están incluidos en la especificación HTTP. Usar un código de estado no reconocido resultará en un error 500 y un mensaje en el log de errores.
La bandera [S] se usa para omitir reglas que no desea ejecutar. La
sintaxis de la bandera skip es [S=N], donde N indica
el número de reglas a omitir (siempre que la
RewriteRule y cualquier directiva
RewriteCond precedente coincidan). Esto puede pensarse como una
sentencia goto en su conjunto de reglas de reescritura. En el siguiente
ejemplo, solo queremos ejecutar la
RewriteRule si la URI solicitada no corresponde a un
archivo real.
# Is the request for a non-existent file?
RewriteCond "%{REQUEST_FILENAME}" !-f
RewriteCond "%{REQUEST_FILENAME}" !-d
# If so, skip these two RewriteRules
RewriteRule ".?" "-" [S=2]
RewriteRule "(.*\.gif)" "images.php?$1"
RewriteRule "(.*\.html)" "docs.php?$1"
Esta técnica es útil porque una RewriteCond solo se aplica a la
RewriteRule inmediatamente
siguiente. Así, si desea hacer que una RewriteCond se aplique
a varias RewriteRules, una técnica posible es negar
esas condiciones y añadir una RewriteRule con una bandera [Skip]. Puede
usar esto para hacer construcciones pseudo if-then-else: La última regla de
la cláusula then se convierte en skip=N, donde N es el
número de reglas en la cláusula else:
# Does the file exist?
RewriteCond "%{REQUEST_FILENAME}" !-f
RewriteCond "%{REQUEST_FILENAME}" !-d
# Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.
RewriteRule ".?" "-" [S=3]
# IF the file exists, then:
RewriteRule "(.*\.gif)" "images.php?$1"
RewriteRule "(.*\.html)" "docs.php?$1"
# Skip past the "else" stanza.
RewriteRule ".?" "-" [S=1]
# ELSE...
RewriteRule "(.*)" "404.php?file=$1"
# END
Probablemente sea más fácil lograr este tipo de configuración usando
las directivas <If>, <ElseIf>, y <Else> en su lugar.
Establece el tipo MIME con el que se enviará la respuesta
resultante. Esto tiene el mismo efecto que la directiva AddType.
Por ejemplo, podría usar la siguiente técnica para servir código fuente Perl como texto plano, si se solicita de una manera particular:
# Servir archivos .pl como texto plano RewriteRule "\.pl$" "-" [T=text/plain]
O, quizás, si tiene una cámara que produce imágenes jpeg sin extensiones de archivo, podría forzar que esas imágenes sean servidas con el tipo MIME correcto por virtud de sus nombres de archivo:
# Los archivos con 'IMG' en el nombre son imágenes jpg. RewriteRule "IMG" "-" [T=image/jpg]
Por favor tenga en cuenta que este es un ejemplo trivial, y podría hacerse mejor
usando <FilesMatch>
en su lugar. Siempre considere las soluciones
alternativas a un problema antes de recurrir a rewrite, que invariablemente
será una solución menos eficiente que las alternativas.
Si se usa en contexto per-directorio, use solo - (guión)
como la sustitución para toda la ronda de procesamiento de mod_rewrite,
de lo contrario el tipo MIME establecido con esta bandera se pierde debido a un
re-procesamiento interno (incluyendo rondas posteriores de procesamiento de mod_rewrite).
La bandera L puede ser útil en este contexto para terminar la
ronda actual de procesamiento de mod_rewrite.
Establecer esta bandera es necesario para permitir que una reescritura continúe si la solicitud HTTP que se está reescribiendo tiene un signo de interrogación codificado, '%3f', y el resultado reescrito tiene un '?' en la sustitución. Esto protege contra una URL maliciosa que aproveche una captura y re-sustitución del signo de interrogación codificado.
Establecer esta bandera es necesario en sustituciones de ámbito de servidor que comienzan con una variable o referencia inversa y se resuelven a una ruta del sistema de archivos. Estas sustituciones no se prefijan con la raíz del documento. Esto protege contra una URL maliciosa que cause que la sustitución expandida se mapee a una ubicación inesperada del sistema de archivos.
Available in Apache HTTP Server 2.5.1 and later.