<-
Apache > Servidor HTTP > Documentación > Versión 2.5 > Rewrite

Banderas de RewriteRule

Idiomas disponibles:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn 

Este documento describe las banderas que están disponibles para la directiva RewriteRule, proporcionando explicaciones detalladas y ejemplos.

Consulte también

top

Introducción

Una 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.

top

B (escapar referencias inversas)

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

top

BNP|backrefnoplus (no escapar espacio a +)

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.

top

BCTLS

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.

top

BNE

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.

top

C|chain

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.

top

CO|cookie

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.

Dominio
El dominio para el cual desea que la cookie sea válida. Este puede ser un nombre de host, como 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:

Tiempo de vida
El tiempo durante el cual la cookie persistirá, en minutos.
Un valor de 0 indica que la cookie persistirá solo durante la sesión actual del navegador. Este es el valor predeterminado si no se especifica ninguno.
Un valor negativo causa que la cookie sea eliminada en el navegador.
Ruta
La ruta, en el sitio web actual, para la cual la cookie es válida, como /customers/ o /files/download/.
Por defecto, esto se establece a / - es decir, todo el sitio web.
Secure
Si se establece a secure, true, o 1, la cookie solo se permitirá ser transmitida a través de conexiones seguras (https).
httponly
Si se establece a 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.
samesite
Si se establece a algo distinto de 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.

top

DPI|discardpath

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.

top

E|env

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.

top

END

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.

top

F|forbidden

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.

top

G|gone

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.

top

H|handler

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.

top

L|last

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]
top

N|next

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]
top

NC|nocase

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]
top

NE|noescape

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):

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.

top

NS|nosubreq

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.

top

P|proxy

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.

Advertencia de Seguridad

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.

Advertencia de Rendimiento

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.

top

PT|passthrough

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 -.

top

QSA|qsappend

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.

top

QSD|qsdiscard

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.

top

QSL|qslast

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.

top

R|redirect

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.

top

S|skip

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.

top

T|type

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.

top

UnsafeAllow3F

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.

top

UnsafePrefixStat

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.

top

UNC

Establecer esta bandera previene la fusión de múltiples barras iniciales, como se usa en las rutas UNC de Windows. La bandera no es necesaria cuando la sustitución de las reglas comienza con múltiples barras literales.

Available in Apache HTTP Server 2.5.1 and later.

Idiomas disponibles:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn