El módulo de reescritura es el ngx_http_rewrite_module
mó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
- 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
-
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
- Uno
变量名
, si el valor de la variable $ variable es una cadena vacía o la cadena "0", es falso 变量
Comparación con una cadena igual a (=) no igual a (! =)注意此处不要把相等当做赋值语句啊
变量
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)- Compruebe si el archivo existe
-f
( Uso ) y!-f
(No existe) - Compruebe si la ruta existe
-d
(existe) y!-d
(no existe), y luego juzgue si puede ser una cadena o una variable - Compruebe si el archivo, la ruta o el archivo de enlace existe
-e
(existe) y!-e
(existe) - Compruebe si el archivo es ejecutable
-x
(ejecutable) y (no ejecutable), y!-x
luego 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 code
devuelva el código especificado al cliente. El code
código no estándar 444 cierra la conexión sin enviar un encabezado de respuesta.
A partir de la 0.8.42
versió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 url
se puede incluir el texto redirigido y de respuesta 变量
.
Hay un caso especial, se redirige url
puede ser especificado para este servidor local urI
, este es el caso, nginx
se basa en las solicitudes de protocolo $scheme
, server_name_in_redirect
y port_in_redirect
genera 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 server
bloque server_name
y listen
el puerto Para redirect
uso)
# 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 regex
para hacer coincidir la solicitud, urI
y si la coincidencia es exitosa, se utiliza el replacement
cambio URI
. rewrite
Las instrucciones se ejecutan en el orden en que aparecen en el archivo de configuración. La flag
bandera se puede usar para terminar el procesamiento posterior de la instrucción. Si la cadena de reemplazo replacement
comienza 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
last
Detener el procesamiento de la corrientengx_http_rewrite_module
del conjunto de instrucciones, y comenzó la búsqueda de cambiosURI
para que coincidalocation
; (ya que los últimos medios en inglés "continúan", vamos a seguir para tratar de igualar el salto otra ubicación)break
Deje de procesar elngx_http_rewrite_module
conjunto de instrucciones actual , al igual que lasbreak
instrucciones anteriores (el corte es "interrupción parada" )redirect
Devuelva 302 para una redirección temporal. (Se puede entender como "alquiler temporario")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 replacement
contiene 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 rewrite
las 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_module
instrucciones 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_module
limit_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
server
Usado 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
- El tipo de signo igual (=) tiene la máxima prioridad. Una vez que la coincidencia es exitosa, no se encuentran otras coincidencias.
- ^ ~ Escriba la expresión. Una vez que la coincidencia es exitosa, no se encuentran otras coincidencias.
- Los tipos de expresiones regulares (~~ *) tienen prioridad. Si la regularidad de varias ubicaciones puede coincidir, se utiliza la expresión regular más larga.
- Tipo de coincidencia de cadena regular. Emparejar por prefijo.