Rewrite#

El módulo se utiliza para cambiar la URI de la solicitud utilizando expresiones regulares PCRE, devolver redirecciones y seleccionar configuraciones condicionalmente.

Las directivas break, if, return, rewrite y set se procesan en el siguiente orden:

  • las directivas de este módulo especificadas en el nivel server se ejecutan secuencialmente;

  • repetidamente:

    • se busca una location basada en la URI de la solicitud;

    • las directivas de este módulo especificadas dentro de la ubicación encontrada se ejecutan secuencialmente;

    • el bucle se repite si una URI de solicitud fue reescrita, pero no más de 10 veces.

Directivas#

break#

Sintaxis

break;

Predeterminado

Contexto

server, location, if

Detiene el procesamiento del conjunto actual de directivas http_rewrite.

Si una directiva se especifica dentro de la location, el procesamiento posterior de la solicitud continúa en esta location.

Ejemplo:

if ($slow) {
    limit_rate 10k;
    break;
}

if#

Sintaxis

if (condición) { ... }

Predeterminado

Contexto

server, location

La condición especificada es evaluada. Si es verdadera, las directivas de este módulo especificadas dentro de las llaves se ejecutan, y a la solicitud se le asigna la configuración dentro de la directiva if. Las configuraciones dentro de las directivas if se heredan del nivel de configuración anterior.

Una condición puede ser cualquiera de las siguientes:

  • un nombre de variable; falso si el valor de una variable es una cadena vacía o "0";

  • comparación de una variable con una cadena usando los operadores "=" y "!=";

  • coincidencia de una variable con una expresión regular usando los operadores "~" (para coincidencias sensibles a mayúsculas y minúsculas) y "~*" (para coincidencias insensibles a mayúsculas y minúsculas). Las expresiones regulares pueden contener capturas que se ponen a disposición para su posterior reutilización en las variables $1..$9. Los operadores negativos "!~" y "!~*" también están disponibles. Si una expresión regular incluye los caracteres "}" o ";", toda la expresión debe estar encerrada entre comillas simples o dobles.

  • comprobación de la existencia de un archivo con los operadores "-f" y "!-f";

  • comprobación de la existencia de un directorio con los operadores "-d" y "!-d";

  • comprobación de la existencia de un archivo, directorio o enlace simbólico con los operadores "-e" y "!-e";

  • comprobación de un archivo ejecutable con los operadores "-x" y "!-x".

Ejemplos:

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}

if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}

Nota

El valor de la variable integrada $invalid_referer es establecido por la directiva valid_referers.

return#

Sintaxis

return código [texto];

return código URL;

return URL;

Predeterminado

Contexto

server, location, if

Detiene el procesamiento y devuelve el código especificado al cliente. El código no estándar 444 cierra una conexión sin enviar una cabecera de respuesta.

Es posible especificar una URL de redirección (para los códigos 301, 302, 303, 307 y 308) o el texto del cuerpo de la respuesta (para otros códigos). El texto del cuerpo de la respuesta y la URL de redirección pueden contener variables. Como caso especial, una URL de redirección puede especificarse como una URI local a este servidor, en cuyo caso la URL de redirección completa se forma de acuerdo con el esquema de solicitud ($scheme) y las directivas server_name_in_redirect y port_in_redirect.

Además, una URL para redirección temporal con el código 302 puede especificarse como único parámetro. Dicho parámetro debe comenzar con la cadena http://, https:// o "$scheme". Una URL puede contener variables.

Véase también la directiva error_page.

rewrite#

Sintaxis

rewrite regex reemplazo [bandera];

Predeterminado

Contexto

server, location, if

Si la expresión regular especificada coincide con una URI de solicitud, la URI se cambia según lo especificado en la cadena de reemplazo. Las directivas rewrite se ejecutan secuencialmente en el orden de su aparición en el archivo de configuración. Es posible terminar el procesamiento posterior de las directivas usando banderas. Si una cadena de reemplazo comienza con http://, https:// o "$scheme", el procesamiento se detiene y la redirección se devuelve al cliente.

Un parámetro opcional bandera puede ser uno de los siguientes:

last

detiene el procesamiento del conjunto actual de directivas http_rewrite e inicia una búsqueda de una nueva location que coincida con el URI modificado;

break

detiene el procesamiento del conjunto actual de directivas http_rewrite como con la directiva break;

redirect

devuelve una redirección temporal con el código 302; se utiliza si una cadena de replacement no comienza con http://, https:// o "$scheme";

permanent

devuelve una redirección permanente con el código 301.

La URL de redirección completa se forma de acuerdo con el esquema de la solicitud ($scheme) y las directivas server_name_in_redirect y port_in_redirect.

Ejemplo:

server {
#    ...
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;
    return  403;
#    ...
}

Pero si estas directivas se colocan dentro de la ubicación "/download/", la bandera last debe ser reemplazada por break, o de lo contrario Angie realizará 10 ciclos y devolverá el error 500:

location /download/ {
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;
    return  403;
}

Si una cadena de replacement incluye nuevos argumentos de solicitud, los argumentos de solicitud anteriores se añaden después de ellos. Si esto no es deseable, colocar un signo de interrogación al final de una cadena de reemplazo evita que se añadan, por ejemplo:

rewrite ^/users/(.*)$ /show?user=$1? last;

Si una expresión regular incluye los caracteres "}" o ";", toda la expresión debe estar entre comillas simples o dobles.

rewrite_log#

Sintaxis

rewrite_log on | off;

Predeterminado

rewrite_log off;

Contexto

http, server, location, if

Habilita o deshabilita el registro de los resultados del procesamiento de las directivas del módulo http_rewrite en el error_log en el nivel notice.

set#

Sintaxis

set $variable value;

Predeterminado

Contexto

server, location, if

Establece un valor para la variable especificada. El valor puede contener texto, variables y su combinación.

uninitialized_variable_warn#

Sintaxis

uninitialized_variable_warn on | off;

Predeterminado

uninitialized_variable_warn on;

Contexto

http, server, location, if

Controla si se registran advertencias sobre variables no inicializadas.

Implementación Interna#

Las directivas del módulo http_rewrite se compilan en la etapa de configuración en instrucciones internas que se interpretan durante el procesamiento de la solicitud. Un intérprete es una simple máquina virtual de pila.

Por ejemplo, las directivas

location /download/ {
    if ($forbidden) {
        return 403;
    }

    if ($slow) {
        limit_rate 10k;
    }

    rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
}

se traducirán en estas instrucciones:

variable $forbidden
check against zero
    return 403
    end of code
variable $slow
check against zero
match of regular expression
copy "/"
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code

Tenga en cuenta que no hay instrucciones para la directiva limit_rate anterior, ya que no está relacionada con el módulo http_rewrite. Se crea una configuración separada para el bloque if. Si la condición es verdadera, se asigna a la solicitud esta configuración donde limit_rate es igual a 10k.

La directiva

rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;

puede reducirse en una instrucción si la primera barra en la expresión regular se coloca dentro de los paréntesis:

rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;

Las instrucciones correspondientes se verán así:

match of regular expression
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code