Nginx 之 Réécrire

1. Expressions régulières Nginx courantes

^:匹配输入字符串的起始位置
$:匹配输入字符串的结束位置
*:匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+:匹配前面的字符一次或者多次。如“ol+”能匹配"ol"及“oll”、"olll",但不能匹配“o”
?:匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,“?”等效于“{
    
    0,1}
.:匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“{
    
    .\n}”之类的模式
\:将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用,如“\n”匹配一个换行符,而“\$”则匹配“$”
\d:匹配纯数字
{
    
    n}:重复n次
{
    
    n,}:重复n次或更多次
{
    
    n,m}:重复n到m次
[]:定义匹配的字符范围
[c]:匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
[a-zA-Z0-9]:匹配所有大小写字母或者数字任意一个
():表达式的开始和结束位置
|:或运算符

Deux, classification de l'emplacement

1、精准匹配:location = / {
    
    ...}
2、一般匹配:location / {
    
    ...}
3、正则匹配:location ~ / {
    
    ...}

3. Règles de correspondance couramment utilisées pour l'emplacement

=:进行普通字符精确匹配,也就是完全匹配
^~:表示普通字符匹配,使用前缀匹配,如果匹配成功,就不再匹配其他的location
~:区分大小写的匹配
~*:不区分大小写的匹配
!~:区分大小写的匹配取非
!~*:不区分大小写的匹配取非

Quatrièmement, priorité de localisation

  • Correspondance exacte en premier =
  • Correspondance du deuxième préfixe ^ ~
  • La seconde est une correspondance régulière selon l'ordre dans le fichier ~ ou ~ *
  • Faites ensuite correspondre la correspondance de préfixe sans aucune modification
  • Enfin, il est remis /
    description de l'instance de l'emplacement correspondant universel :
(1)location = / {
    
    }
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

(2)location / {
    
    }
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)

(3)location /documents/ {
    
    }
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

(4)location /documents/abc {
    
    }
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

(5)location ^~ /images/ {
    
    }
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

(6)location ~* \.(gif|jpg|jpeg)$ {
    
    }
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

(7)location /images/abc {
    
    }
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

(8)location ~ /images/abc {
    
    }
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

(9)location /images/abc/1.html {
    
    }
匹配/images/abc/1.html 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高

Récapitulatif des priorités
(emplacement = chemin complet)> (emplacement ^ ~ chemin complet)> (emplacement ~, ~ * ordre normal)> (chemin de départ de la partie emplacement)> (emplacement /)

5. Les règles de correspondance utilisées sur le site Web actuel ont au moins trois règles de correspondance.

#第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
可以是个静态首页,可以直接转发给后端应用服务器
location = / {
    
    
   root  html;
   index index.html index. htm;
}

#第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
    
    
    root /webroot/static/;
}

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

#第三个规则就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求
location / {
    
    
    proxy_pass http://tomcat_server;
}

Six, réécrire l'introduction

1. Le rôle de la réécriture

Le rôle de la réécriture est d'utiliser des variables globales fournies par nginx ou des variables définies par vous-même, combinées avec des expressions régulières et des indicateurs pour réaliser la réécriture et la redirection d'URL.
Par exemple: après avoir changé le nom de domaine, vous devez conserver l'ancien nom de domaine pour pouvoir accéder au nouveau nom de domaine, une page Web change et vous devez accéder à une nouvelle page, chaîne antivol de site Web, etc.,
réécrire ne peut être placé que dans le serveur {}, location {}, If {} et la valeur par défaut ne peut fonctionner que sur la chaîne après le nom de domaine, à l'exception des paramètres passés,
par exemple http://www.kgc.com/a/ we / index.php? id = 1 & u = str uniquement pour /a/we/index.php est réécrit.

2. Réécrire l'implémentation du saut

Nginx: prend en charge la réécriture d'URL via le module ngx_http_rewrite_module, prend en charge le jugement de condition, mais ne prend pas en charge le
saut d' autre : saute d'un endroit à un autre, la boucle peut être exécutée jusqu'à 10 fois, après avoir dépassé, nginx renverra une erreur 500
PCRE support: perl Compatible avec la règle de grammaire d'expression régulière correspondant à l'
instruction d'ensemble du module de réécriture: créer une nouvelle variable et définir sa valeur

3. La séquence d'exécution de la réécriture est la suivante

  • Exécutez la commande de réécriture dans le bloc serveur.
  • Effectuez une correspondance de localisation.
  • Exécutez la commande de réécriture à l'emplacement sélectionné.

4. Réécrire la syntaxe

rewrite <regex> <replacement> [flag]

regex: représente les règles de correspondance régulières.
remplacement: indique le contenu après le saut.
flag: indique l'indicateur d'indicateur pris en charge par la réécriture.

5. Description du drapeau

ast :本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中。
break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

Pour résumer: du point de vue fonctionnel, la réécriture et la localisation semblent être un peu similaires, les deux peuvent réaliser des sauts. La principale différence est que la réécriture consiste à changer le chemin pour obtenir des ressources dans le même nom de domaine, tandis que la localisation est à contrôler l'accès ou le proxy inverse pour un type de chemin. Peut proxy_pass vers d'autres machines.

Sept, réécrire l'instance

1. Redirection basée sur le nom de domaine

Maintenant, l'ancien nom de domaine de la société www.kgc.com a changé ses besoins commerciaux et il doit être remplacé par un nouveau nom de domaine www.benet.com, mais l'ancien nom de domaine ne peut pas être aboli, il doit être redirigé vers le nouveau nom de domaine et les paramètres suivants restent inchangés.

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;————————日志修改
	location / {
    
    
	#添加域名重定向
        if ($host = 'www.kgc.com'){
    
    ————————————$host为rewrite全局变量,代表请求主机头字段或主机名
			rewrite ^/(.*)$ http://www.benet.com/$1 permanent;	————————$1为正则匹配的内容,即域名后边的字符串
        }
        root   html;
        index  index.html index.htm;
    }
}

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

La simulation d'entrée du navigateur visitez http://www.kgc.com/test/1.html (ce contenu de demande n'existe pas) passera à www.benet.com/test/1.html, vous pouvez voir les éléments Retour à 301 , une redirection permanente est réalisée, et les paramètres après le nom de domaine sont également redirigés normalement
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici

2. Redirection d'accès basée sur l'adresse IP du client

Aujourd'hui, la nouvelle version des activités de l'entreprise est en ligne, ce qui oblige toutes les adresses IP à accéder à tout contenu pour afficher une page de maintenance fixe. Seule l'adresse IP de l'entreprise: 192.168.241.3 est normalement accessible.

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.241.3"){
    
    ————————————————当客户端IP为192.168.80.10时,将变量值设为false,不进行重写
        set $rewrite false;
    }
	#除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){
    
    ——————————————————当变量值为true时,进行重写
        rewrite (.+) /weihu.html;————————————重写在访问IP后边插入/weihu.html,例如192.168.241.3/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>this is test</h1>" > /var/www/html/weihu.html

systemctl restart nginx

只有 IP 为 192.168.241.3 能正常访问,其它地址都是维护页面

Insérez la description de l'image ici
L'adresse IP 192.168.241.3 est accessible normalement: d'
Insérez la description de l'image ici
autres adresses IP peuvent accéder:
Insérez la description de l'image ici

3. En vous basant sur l'ancien nom de domaine, accédez au nouveau nom de domaine et ajoutez un répertoire

Maintenant que vous visitez http://bbs.kgc.com, vous devez maintenant rediriger toutes les visites sous ce nom de domaine vers http://www.kgc.com/bbs

vim /usr/local/nginx/conf/nginx.conf
server {
    
    
	listen       80;
	server_name  bbs.kgc.com;——————————域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log;————————日志修改
	location /post {
    
    ——————————添加域名重定向
      rewrite (.+) http://www.kgc.com/bbs$1 permanent;	————————这里的$1为位置变量,代表/post
        }
    location / {
    
    
        root   html;
        index  index.html index.htm;
    }
}

mkdir -p /usr/local/nginx/html/bbs
echo "this is test.html"  >> /usr/local/nginx/html/bbs/1.html
echo "192.168.241.3 bbs.kgc.com"  >> /etc/hosts
systemctl restart nginx
使用浏览器访问 http://bbs.kgc.com/post/1.html 跳转到 http://www.kgc.com/bbs/post/1.html

Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici

4. Saut en fonction de la correspondance des paramètres

Maintenant, visitez http://www.kgc.com/100-(100|200)-100.html pour accéder à la page http://www.kgc.com.

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;
	location ~ /100-(100|200)-(\d+).html$ {
    
    
	#if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
    
    
        rewrite (.+) http://www.kgc.com permanent;
    }
	location / {
    
    
        root   html;
        index  index.html index.htm;
    }
}

systemctl restart nginx

Utilisez un navigateur pour visiter http://www.kgc.com/100-200-100.html ou http://www.kgc.com/100-100-100.html pour accéder à http: //www.kgc .com page.
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici

5. Jump basé sur tous les fichiers se terminant par php dans le répertoire

Demandez à visiter http://www.kgc.com/upload/123.php pour accéder à la page d'accueil.

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;
	location ~* /upload/.*\.php$ {
    
    
        rewrite (.+) http://www.kgc.com permanent;
    }
	location / {
    
    
        root   html;
        index  index.html index.htm;
    }
}

systemctl restart nginx

Le navigateur visite http://www.kgc.com/upload/123.php pour accéder à la page http://www.kgc.com.
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici

6. Jump basé sur la demande d'URL la plus courante

Demande de visite d'une page spécifique telle que http://www.kgc.com/abc/123.html pour accéder à la page d'accueil

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 ~* ^/abc/123.html {
    
    
        rewrite (.+) http://www.kgc.com permanent;
    }
	location / {
    
    
        root   html;
        index  index.html index.htm;
    }
}

systemctl restart nginx

Navigateur visitez http://www.kgc.com/abc/123.html pour accéder à la page http://www.kgc.com.
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/weixin_51432789/article/details/112604029
conseillé
Classement