Comprensión profunda del módulo de reescritura de Nginx

El módulo de reescritura es el ngx_http_rewrite_modulemódulo y su función principal es reescribir el URI de solicitud, que es el módulo instalado de manera predeterminada en Nginx. El módulo de reescritura coincidirá con el URI de reescritura de acuerdo con la regularidad PCRE, y luego iniciará un salto interno para coincidir con la ubicación, o directamente hará una redirección 30x de regreso al cliente.

Orden de ejecución de instrucciones

  1. Primero ejecute las instrucciones del módulo de reescritura en el bloque del servidor en secuencia para obtener el URI de la solicitud después de reescribir
  2. Luego repita las siguientes instrucciones

    > 如果没有遇到中断循环标志,此循环最多执行10次,但是我们可以使用break指令来中断rewrite后的新一轮的循环
    

(1). De acuerdo con el URI de la solicitud después de reescribir, haga coincidir el bloque de ubicación definido

(2). Ejecutar secuencialmente las instrucciones del módulo de reescritura en la ubicación coincidente

Instrucción

descanso

Contexto: servidor, ubicación, si

Deje de ejecutar el conjunto de instrucciones ngx_http_rewrite_module, pero las instrucciones de otros módulos no se ven afectadas
.

server {
    listen 8080;
    # 此处 break 会停止执行 server 块的 return 指令(return 指令属于rewrite模块) # 如果把它注释掉 则所有请求进来都返回 ok
    break; return 200 "ok"; location = /testbreak { break; return 200 $request_uri; proxy_pass http://127.0.0.1:8080/other; } location / { return 200 $request_uri; } } # 发送请求如下 # curl 127.0.0.1:8080/testbreak # /other # 可以看到 返回 `/other` 而不是 `/testbreak`,说明 `proxy_pass` 指令还是被执行了 # 也就是说 其他模块的指令是不会被 break 中断执行的 # (proxy_pass是ngx_http_proxy_module的指令) 

Si

Contexto: servidor, ubicación

Decidir si ejecutar el contenido en la instrucción if block de acuerdo con las condiciones especificadas

Varias condiciones de juicio en if

  1. Uno 变量名, si el valor de la variable $ variable es una cadena vacía o la cadena "0", es falso
  2. 变量Comparación con una cadena igual a (=) no igual a (! =) 注意此处不要把相等当做赋值语句啊
  3. 变量Y un juego regular de patrón de expresión puede ser operador ( ~ caso sensible a juego regular,  ~*sensible a las mayúsculas a juego ordinario ,  !~ !~*no tanto frente)
  4. Compruebe si el archivo existe -f( Uso  ) y  !-f(No existe)
  5. Compruebe si la ruta existe  -d(existe) y  !-d(no existe), y luego juzgue si puede ser una cadena o una variable
  6. Compruebe si el archivo, la ruta o el archivo de enlace existe  -e(existe) y  !-e(existe)
  7. Compruebe si el archivo es ejecutable  -x(ejecutable) y (no ejecutable), y  !-xluego juzgue si puede ser una cadena o una variable

Tenga en cuenta que los elementos 1, 2 y 3 anteriores deben juzgarse como variables. 4, 5, 6, 7 pueden ser variables o cadenas. El uso básico de -f / -d / -e / -x es consistente con bash .

set $variable "0"; 
if ($variable) { # 不会执行,因为 "0" 为 false break; } # 使用变量与正则表达式匹配 没有问题 if ( $http_host ~ "^star\.igrow\.cn$" ) { break; } # 字符串与正则表达式匹配 报错 if ( "star" ~ "^star\.igrow\.cn$" ) { break; } # 检查文件类的 字符串与变量均可 if ( !-f "/data.log" ) { break; } if ( !-f $filename ) { break; }

regreso

Contexto: servidor, ubicación, si

return code [text];
return code URL;
return URL;

Detenga el procesamiento y codedevuelva el código especificado al cliente. El codecódigo no estándar 444 cierra la conexión sin enviar un encabezado de respuesta.

A partir de la 0.8.42versión, la  return declaración puede especificar la redirección  url (los códigos de estado pueden ser 301.302.303.307 de la siguiente manera),
y también puede especificar el contenido del texto de respuesta para otros códigos de estado, y urlse puede incluir el texto redirigido y de respuesta 变量.

Hay un caso especial, se redirige urlpuede ser especificado para este servidor local urI, este es el caso, nginxse basa en las solicitudes de protocolo $schemeserver_name_in_redirect y  port_in_redirectgenera automáticamente un completo  url (que se describirá aquí está server_name_in_redirect y port_in_redirect que indica la instrucción si el serverbloque  server_name y  listen el puerto Para redirectuso)

# return code [text]; 返回 ok 给客户端
location = /ok {
    return 200 "ok";
}

# return code URL; 临时重定向到 百度 location = /redirect { return 302 http://www.baidu.com; } # return URL; 和上面一样 默认也是临时重定向 location = /redirect { return http://www.baidu.com; }

volver a escribir

Contexto: servidor, ubicación, si

rewrite regex replacement [flag];

rewrite La instrucción usa la expresión regular especificada regexpara hacer coincidir la solicitud, urIy si la coincidencia es exitosa, se utiliza el replacementcambio URI. rewriteLas instrucciones se ejecutan en el orden en que aparecen en el archivo de configuración. La flagbandera se puede usar para terminar el procesamiento posterior de la instrucción. Si la cadena de reemplazo replacementcomienza con http://, https://o $ scheme, deja de procesar el contenido posterior y redirige directamente al cliente.

Cadena reescrita en el primer casohttp://

location / {
    # 当匹配 正则表达式 /test1/(.*)时 请求将被临时重定向到 http://www.$1.com
    # 相当于 flag 写为 redirect
    rewrite /test1/(.*) http://www.$1.com; return 200 "ok"; } # 在浏览器中输入 127.0.0.1:8080/test1/baidu # 则临时重定向到 www.baidu.com # 后面的 return 指令将没有机会执行了

El segundo caso reescribe la cadena sinhttp://

location / {
    rewrite /test1/(.*) www.$1.com;
    return 200 "ok"; } # 发送请求如下 # curl 127.0.0.1:8080/test1/baidu # ok # 此处没有带http:// 所以只是简单的重写。请求的 uri 由 /test1/baidu 重写为 www.baidu.com # 因为会顺序执行 rewrite 指令 所以 下一步执行 return 指令 响应了 ok 

Las cuatro banderas de reescribir

  1. last
    Detener el procesamiento de la corriente ngx_http_rewrite_moduledel conjunto de instrucciones, y comenzó la búsqueda de cambios URIpara que coincida location; (ya que los últimos medios en inglés "continúan", vamos a seguir para tratar de igualar el salto otra ubicación)
  2. break
    Deje de procesar el ngx_http_rewrite_moduleconjunto de instrucciones actual , al igual que las breakinstrucciones anteriores (el corte es "interrupción parada" )
  3. redirect
    Devuelva 302 para una redirección temporal. (Se puede entender como "alquiler temporario")
  4. permanent
    Devuelve 301 redirección permanente. (Se puede entender como "mudarse de una casa nueva")
# 没有rewrite 后面没有任何 flag 时就顺序执行 
# 当 location 中没有 rewrite 模块指令可被执行时 就重写发起新一轮location匹配
location / {
    # 不加 flag, 默认顺序执行
    rewrite ^/test1 /test2; rewrite ^/test2 /test3; # 此处发起新一轮location匹配 uri为/test3 } location = /test2 { return 200 "/test2"; } location = /test3 { return 200 "/test3"; } # 发送如下请求 # curl 127.0.0.1:8080/test1 # /test3
La diferencia entre último y descanso

Último y descanso, terminarán la ejecución de otras instrucciones del módulo de reescritura en esta ubicación,
pero el último inicia inmediatamente una nueva ronda de coincidencia de ubicación y el descanso no

location / {
    rewrite ^/test1 /test2;
    rewrite ^/test2 /test3 last; # 此处发起新一轮location匹配 uri为/test3 rewrite ^/test3 /test4; proxy_pass http://www.baidu.com; } location = /test2 { return 200 "/test2"; }  location = /test3 { return 200 "/test3"; } location = /test4 { return 200 "/test4"; } # 发送如下请求 # curl 127.0.0.1:8080/test1 # /test3 当如果将上面的 location / 改成如下代码 location / { rewrite ^/test1 /test2;  # 此处 不会 发起新一轮location匹配;当是会终止执行后续rewrite模块指令 重写后的uri为 /more/index.html rewrite ^/test2 /more/index.html break; rewrite /more/index\.html /test4; # 这条指令会被忽略  # 因为 proxy_pass 不是rewrite模块的指令 所以它不会被 break终止 proxy_pass https://www.baidu.com; } # 发送如下请求 # 浏览器输入 127.0.0.1:8080/test1 # 代理到 百度产品大全页面 https://www.baidu.com/more/index.html;
 

Solicitar parámetros después de reescribir

Si la cadena de reemplazo replacementcontiene nuevos parámetros de solicitud, los parámetros de solicitud anteriores se agregan después de ellos. Si no desea los parámetros anteriores, replacement coloque un signo de interrogación al final de la cadena de reemplazo  para evitar agregarlos .

# 由于最后加了个 ?,原来的请求参数将不会被追加到rewrite之后的url后面 
rewrite ^/users/(.*)$ /show?user=$1? last;

rewrite_log

Contexto: http, servidor, ubicación, si

Abrir o cerrar  rewritelas instrucciones del módulo de registro para su ejecución, si está habilitado, reescribiendo el registro de notice nivel para el registro nginx de  error_log la por defecto está desactivada off

Syntax: rewrite_log on | off;

conjunto

Contexto: servidor, ubicación, si

Establece el valor de la variable especificada. Los valores variables pueden contener texto, variables o una combinación de ellos.

location / {
    set $var1 "host is ";
    set $var2 $host; set $var3 " uri is $request_uri"; return 200 "response ok $var1$var2$var3"; } # 发送如下请求 # curl 127.0.0.1:8080/test # response ok host is 127.0.0.1 uri is /test

advertencia_variable_inicializado

Contexto: http, servidor, ubicación, si

Controla si se registran advertencias sobre variables no inicializadas. Encendido por defecto

 

Realización interna

Las ngx_http_rewrite_moduleinstrucciones del módulo se compilan en el procesamiento solicitado durante la fase de configuración para interpretar las instrucciones internas. El intérprete es una máquina apiladora virtual simple.

Por ejemplo, la instrucción

ubicación / descarga / { 
    if ($ prohibido) { 
        return 403; 
    } 

    if ($ lento) { 
        limit_rate 10k; 
    } 

    reescribir ^ / (descargar /.*)/ media /(.*)\..*$ /$1/mp3/$2.mp3 break; 
}

Será traducido a las siguientes instrucciones:

variable $ 
comprobación prohibida contra 
    retorno cero 403 
    final del código 
variable $ 
comprobación lenta contra 
coincidencia cero de expresión regular 
copia "/" 
copia $ 1 
copia "/ mp3 /" 
copia $ 2 
copia ".mp3" 
final de expresión regular 
final del código

Tenga en cuenta que la instrucción limit_rate  anterior no tiene ninguna  instrucción porque no tiene nada que ver  con el módulo . Cree una configuración separada para el bloque if . Si la condición es verdadera, se asignará una solicitud para esta configuración, que es igual a 10k.ngx_http_rewrite_modulelimit_rate

Instrucción

reescribir ^ / (descargar /.*)/ media /(.*)\..*$ /$1/mp3/$2.mp3 break;

Si la primera barra diagonal de la expresión regular se coloca entre paréntesis, se puede simplificar:

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

Las instrucciones correspondientes serán las siguientes:

coincidencia de la expresión regular 
copia $ 1 
copia "/ mp3 /" 
copia $ 2 
copia ".mp3" 
final de la expresión regular 
final del código

 


ubicación (módulo sin reescritura)

Gramática

serverUsado en bloques, tales como:

  • servidor {
  • expresión de ubicación {
  • }
  • }

tipo de expresión de ubicación

  • Si escribe una ruta directamente, coincide con la ruta
  • ~ Significa realizar una coincidencia regular, distingue entre mayúsculas y minúsculas
  • ~ * Significa realizar una coincidencia regular, no mayúsculas y minúsculas
  • ^ ~ Indica coincidencia de caracteres comunes. Usar coincidencia de prefijo. Si la coincidencia es exitosa, ya no coincidirá con otras ubicaciones.
  • = Realizar coincidencia exacta de caracteres. Esa es una coincidencia exacta.

Prioridad

    1. El tipo de signo igual (=) tiene la máxima prioridad. Una vez que la coincidencia es exitosa, no se encuentran otras coincidencias.
    2. ^ ~ Escriba la expresión. Una vez que la coincidencia es exitosa, no se encuentran otras coincidencias.
    3. Los tipos de expresiones regulares (~~ *) tienen prioridad. Si la regularidad de varias ubicaciones puede coincidir, se utiliza la expresión regular más larga.
    4. Tipo de coincidencia de cadena regular. Emparejar por prefijo.

Supongo que te gusta

Origin www.cnblogs.com/sunsky303/p/12718378.html
Recomendado
Clasificación