Explicación detallada del salto de ubicación y reescritura del sistema Linux y análisis de ejemplo

1. Reescribe la explicación

Utilice variables globales proporcionadas por nginx o variables establecidas por usted mismo, combinadas con expresiones regulares y banderas para lograr la reescritura y la redirección de URL.

(1) Escena de salto

Inserte la descripción de la imagen aquí

(2) Realización del salto

Inserte la descripción de la imagen aquí

(3) Expresión regular de Nginx
personaje significado
^ Coincidir con la posición inicial de la cadena de entrada
PS Coincidir con la posición final de la cadena de entrada
* Coincide con el carácter anterior cero o más veces
+ Coincide con el carácter anterior una o más veces
? Coincide con el carácter anterior cero o una vez
. Coincidir con todos los caracteres excepto "\ n"
\ Marque el siguiente carácter como un carácter especial o un carácter literal o una referencia posterior
\D Coincidir con números puros
{norte} Repite n veces
{norte,} Repetir n veces o más
[C] Coincide con un solo carácter c
[Arizona] Coincidir con cualquiera de las letras minúsculas az
[a-zA-Z0-9] Coincidir con todos los números o letras mayúsculas y minúsculas
() La posición inicial y final de la expresión.
(4) Formato gramatical
rewrite <regex> <replacement> [flag];
regex :表示正则匹配规则。
replacement :表示跳转后的内容。
flag :表示 rewrite 支持的 flag 标记。
flag标记说明
last :本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中。
break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

Dos, experimento de reescritura

(1) Redirigir según el nombre de dominio

Ahora, el antiguo nombre de dominio de la empresa www.kgc.com tiene cambios necesarios para el negocio, y necesita ser reemplazado por un nuevo nombre de dominio www.benet.com, pero el antiguo nombre de dominio no puede ser abolido y necesita ser redirigido al nuevo nombre de dominio y los siguientes parámetros permanecen sin cambios.

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.kgc.com;	#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log  main; #日志修改
	location / {
	#添加域名重定向
        if ($host = 'www.kgc.com'){	 #$host为rewrite全局变量,代表请求主机头字段或主机名
			rewrite ^/(.*)$ http://www.benet.com/$1 permanent;	#$1为正则匹配的内容,即域名后边的字符串
        }
        root   html;
        index  index.html index.htm;
    }
}

echo "IP www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx

浏览器输入模拟访问 http://www.kgc.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.benet.com/test/1.html
查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

Inserte la descripción de la imagen aquí

(2) Redireccionamiento de acceso basado en la IP del cliente

Hoy, la nueva versión del negocio de la empresa está en línea, lo que requiere que todas las IP accedan a cualquier contenido para mostrar una página de mantenimiento fija, y solo se puede acceder normalmente a la IP de la empresa: 192.168.90.14.

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.kgc.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log;	#日志修改

	#设置是否合法的IP标记
    set $rewrite true;							#设置变量$rewrite,变量值为boole值true
    
    #判断是否为合法IP
	if ($remote_addr = "192.168.90.14"){		#当客户端IP为192.168.90.14时,将变量值设为false,不进行重写
        set $rewrite false;
    }
	
	#除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){						#当变量值为true时,进行重写
        rewrite (.+) /weihu.html;				#重写在访问IP后边插入/weihu.html
    }
    
    location = /weihu.html {
        root /var/www/html;						#网页返回/var/www/html/weihu.html的内容
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}


mkdir -p /var/www/html/
echo "<h1>We are maintaining now</h1>" > /var/www/html/weihu.html
systemctl restart nginx
只有 IP 为 192.168.90.14 能正常访问,其它地址都是维护页面

Tres, explicación de la ubicación

Desde el punto de vista de la función, la reescritura y la ubicación parecen ser un poco similares. Ambos pueden lograr la redirección. La
principal diferencia es que la reescritura es cambiar la ruta para obtener recursos dentro del mismo nombre de dominio, mientras que la ubicación es para controlar el acceso o revertir proxy para un tipo de ruta, y también puede pasar proxy_pass a otra máquina.

(1) La ubicación se puede dividir aproximadamente en tres categorías:
  • Coincidencia exacta: ubicación = / {}
  • Coincidencia general: ubicación / {}
  • Coincidencia habitual: ubicación ~ / {}
(2) Reglas de coincidencia de ubicación comúnmente utilizadas:
= :进行普通字符精确匹配,也就是完全匹配。 
^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。 
~ :区分大小写的匹配。 
~* :不区分大小写的匹配。 
!~ :区分大小写的匹配取非。 
!~* :不区分大小写的匹配取非。
(3) Prioridad de ubicación:
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通用匹配

Instancia prioritaria

  • location = / {}
    = es una coincidencia exacta /, el nombre de host no puede ir seguido de ninguna cadena, como acceder a / y / data, luego / coincide, / data no coincide. Por ejemplo, ubicación = / abc, solo / abc y / abc coinciden / O / abcd no coincide. Si la ubicación es / abc, coincidirá con / abc, / abcd / y / abc / al mismo tiempo.

  • location / {} Debido a que todas las direcciones comienzan con /, esta regla coincidirá con todas las solicitudes, como el acceso a / y / data, luego / coincidirá, y / data también coincidirá, pero si hay una expresión regular, coincidirá con el cadena de caracteres más larga primera coincidencia (coincidencia más larga)

  • location / documents / {} coincide con cualquier dirección que comience con / documents /. Una vez que la coincidencia sea coincidente, continúe buscando otras ubicaciones. Solo cuando las expresiones regulares detrás de otras ubicaciones no coincidan, se usará esta

  • location / documents / abc {} coincide con cualquier
    dirección que comience con / documents / abc . Una vez que se cumpla la coincidencia, continúe buscando otras ubicaciones. Solo cuando las expresiones regulares detrás de otras ubicaciones no coincidan, se utilizará esta

  • location ^ ~ / images / {} coincide con cualquier dirección que comience con / images /, después de que se cumpla la coincidencia, deja de buscar lo normal, usa este

  • ubicación ~ *. (gif | jpg | jpeg) $ {} coincide con todas las solicitudes que terminan en gif, jpg o jpeg. Sin embargo, todas las solicitudes de imágenes en / images / serán procesadas por ubicación ^ ~ / images / porque ^ ~ toma precedencia El nivel es más alto, por lo que esta regla no se puede alcanzar

  • location / images / abc {} El carácter más largo coincide con / images / abc, con la prioridad más baja. Si continúa buscando otras ubicaciones, encontrará que ^ ~ y ~ existen

  • location ~ / images / abc {} coincide con los que comienzan con / images / abc, la prioridad es la segunda, solo si se elimina la ubicación ^ ~ / images /, esta será adoptada

  • location /images/abc/1.html {} coincide con el archivo /images/abc/1.html. Si se compara con el ~ / images / abc / 1.html normal, la prioridad normal es mayor.
    Resumen de prioridades:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

Cuatro, experimento de ubicación

En el uso real del sitio web, existen al menos tres definiciones de reglas coincidentes:

(1) La primera regla requerida
coincide directamente con la raíz del sitio web. Es más frecuente visitar la página de inicio del sitio web a través del nombre de dominio. Su uso acelerará el procesamiento, como el sitio web oficial.
Esto se reenvía directamente al servidor de aplicaciones back-end o puede ser una página de inicio estática.

location = / {
    proxy_pass http://tomcat_server/;
}

(2) La segunda regla obligatoria es procesar solicitudes de archivos estáticos, que es la fuerza de nginx como servidor http.
Hay dos modos de configuración, coincidencia de directorio o coincidencia de sufijo, elija uno de ellos o utilícelos juntos

location ^~ /static/ {
    root /webroot/static/;
}

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

(3) La tercera regla es una regla general, por ejemplo, se utiliza para reenviar solicitudes dinámicas con sufijos .php y .jsp al servidor de aplicaciones back-end.
Las solicitudes de archivos no estáticos son solicitudes dinámicas por defecto.

location / {
    proxy_pass http://tomcat_server;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_51468875/article/details/112610104
Recomendado
Clasificación