Introduction to Nginx's regular expressions, location matching, and rewrite

1. Nginx regular expressions

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

2. Introduction to location matching

From the function point of view, rewrite and location seem to be very similar, and both can realize jumping. The main difference is that rewrite is to change the path to obtain resources within the same domain name, while location is to control access or reverse proxy for a type of path, and proxy_pass can also be used. to other machines.

1. Matching rule format

①, precise matching

img

②, general matching

img

③, regular matching

img

2. Commonly used matching rules

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

3. Matching priority

首先精确匹配 =
其次前缀匹配 ^~
再其次是按文件中顺序的正则匹配 ~~*
然后匹配不带任何修饰的前缀匹配(一般匹配)
最后是交给 / 通用匹配

img

4. Examples

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 相比,正则优先级更高

5. In actual website use, there are at least three matching rule definitions

①, the first mandatory rule

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
这里是直接转发给后端应用服务器了,也可以是一个静态首页
 
location = / {
    
    
    proxy_pass http://tomcat_server/;
}

②, the second mandatory rule

处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
 
location ^~ /static/ {
    
    
    root /webroot/static/;
}
 
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    
    
    root /webroot/res/;
}

③, the third rule

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

Three, rewrite rewrite

The rewrite function is to use the global variables provided by nginx or the variables set by yourself, combined with regular expressions and tags to achieve URL rewriting and redirection.
For example: after changing the domain name, it is necessary to keep the old domain name to be able to transfer to the new domain name, to jump to the new page when a certain web page changes, to prevent hotlinking of the website, and so on.
rewrite can only be placed in server{}, location{}, if{}, and by default it can only work on the string after the domain name except the passed parameters.
For example: http://www.lucien.com/a/we/index.php?id=1&u=str Only rewrite /a/we/index.php.

1. Rewrite jump implementation

img

Nginx: The ngx_http_rewrite_module module supports URL rewriting and if condition judgment, but does not support else
jump: jump from one location to another, the cycle can be executed up to 10 times, and nginx will return 500 errors after exceeding
PCRE support: perl Grammatical rule matching compatible with regular expressions
Rewrite the module set instruction: create a new variable and assign it a value

2. Rewrite execution sequence

1. Execute the rewrite command in the server block
2. Execute location matching
3. Execute the rewrite command in the selected location

3. Rewrite syntax format

语法rewrite<regex><replacement><flag>;
regex:表示正则匹配规则
replacement:表示跳转后的内容
flag:表示rewrite支持的flag标记

4. Description of flag mark

last : After the matching of this rule is completed, continue to match the new location URI rule downwards, which is generally used in server and if.
break : This rule is terminated after matching, and will not match any subsequent rules. It is generally used in location.
redirect : Return 302 temporary redirection, and the browser address will display the redirected URL address.
permanent : Return 301 permanent redirection, and the URL address after the redirection will be displayed in the browser address bar.

4. Example of rewrite

1. Jump based on domain name

Now the company's old domain name www.lic.com has changed business requirements and needs to be replaced by the new domain name www.kiki.com, but the old domain name cannot be abolished and needs to be redirected to the new domain name, and the parameters behind it remain unchanged.

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

img

insert image description here

img

echo “192.168.184.10 www.lic.com www.kiki.com” >> /etc/hosts

img

systemctl restart nginx

img

img

The browser enters the simulated access to http://www.lic.com/test/1.html
and it will jump to www.kiki.com/test/1.html. If you view the elements, you can see that it returns 301, which realizes a permanent redirection jump forward, and the parameters after the domain name also jump normally.

insert image description here

img

2. Access jump based on client IP

Today, the new version of the company's business is online, requiring all IPs to access any content to display a fixed maintenance page, and only the company's IP: 192.168.184.10 can access normally.

vim /usr/local/nginx/conf/nginx.conf
server {
    
    
	listen       80;
	server_name  www.lic.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.lic.com-access.log  main;		#日志修改
 
	#设置是否合法的IP标记
    set $rewrite true;							#设置变量$rewrite,变量值为boole值true
    #判断是否为合法IP
	if ($remote_addr = "192.168.184.10"){
    
    		#当客户端IP192.168.184.10时,将变量值设为false,不进行重写
        set $rewrite false;
    }
	#除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){
    
    						#当变量值为true时,进行重写
        rewrite (.+) /weihu.html;				#重写在访问IP后边插入/weihu.html,例如192.168.184.11/weihu.html
    }
    location = /weihu.html {
    
    
        root /var/www/html;						#网页返回/var/www/html/weihu.html的内容
    }
	
	location / {
    
    
        root   html;
        index  index.html index.htm;
    }
}

img

img

mkdir -p /var/www/html/
echo 'hello weihu!' > /var/www/html/weihu.html
systemctl restart nginx

img

For browser access,
only the IP address 192.168.184.10 can be accessed normally, and other addresses are maintenance pages
**img

img

3. Based on the old domain name, jump to the new domain name and add a directory

Now I am visiting http://kiki.lic.com, now I need to redirect all visits under this domain name to http://www.lic.com/kiki

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

insert image description here

img

mkdir -p /usr/local/nginx/html/kiki/post
systemctl restart nginx.service 

img

Use a browser to visit
http://kiki.lic.com/post/1.html and jump to http://www.lic.com/kiki/post/1.html

echo 'this is 1.html' > /usr/local/nginx/html/kiki/post/1.html
systemctl restart nginx.service 

img

4. Jump based on parameter matching

Now visit http://www.lic.com/100-(100|200)-100.html and jump to http://www.lic.com page.

vim /usr/local/nginx/conf/nginx.conf
server {
    
    
	listen       80;
	server_name  www.lic.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.lic.com-access.log  main;
	
	if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
    
    
        rewrite (.+) http://www.lic.com permanent;
    }
 
	location / {
    
    
        root   html;
        index  index.html index.htm;
    }
}

img

img

systemctl restart nginx

Browser access
http://www.lic.com/100-200-100.html or http://www.lic.com/100-100-100.html Jump to http://www.lic.com page.

img

5. Jump based on all files ending in php in the directory

Request to visit http://www.lic.com/upload/123.php Jump to the home page.

vim /usr/local/nginx/conf/nginx.conf
server {
    
    
	listen       80;
	server_name  www.lic.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.lic.com-access.log  main;
	
location ~* /upload/.*\.php$ {
    
    
    rewrite (.+) http://www.lic.com permanent;
}
 
location / {
    
    
    root   html;
    index  index.html index.htm;
}
}

img

img

systemctl restart nginx

The browser accesses
http://www.lic.com/upload/123.php and jumps to the http://www.lic.com page.

img

6. Jump based on the most common url request

Request to visit a specific page such as http://www.lic.com/abc/123.html Jump to the home page

vim /usr/local/nginx/conf/nginx.conf
server {
    
    
	listen       80;
	server_name  www.lic.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.lic.com-access.log  main;
	
    location ~* ^/abc/123.html {
    
    
        rewrite (.+) http://www.lic.com permanent;
    }
 
	location / {
    
    
        root   html;
        index  index.html index.htm;
    }
}

img

img

systemctl restart nginx

img

img

Guess you like

Origin blog.csdn.net/qq_43842093/article/details/130439462