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#
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#
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#
| |
Predeterminado | — |
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#
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:
| 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; |
| detiene el procesamiento del conjunto actual de directivas http_rewrite como con la directiva break; |
| devuelve una redirección temporal con el código 302; se utiliza si una cadena de |
| 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#
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#
Establece un valor para la variable especificada. El valor puede contener texto, variables y su combinación.
uninitialized_variable_warn#
| |
Predeterminado |
|
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