Nginx Location匹配 和 Rewrite重写

前言:Nginx 正则表达式

^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
匹配前面的字符零次或一次
. 匹配除 “\n” 之外的任何单个字符
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d 匹配纯数字
{n} 重复n次
{n,} 重复n次或者更多次
[c] 匹配单个字符c
[a-z] 匹配a-z小写字母的任意一个
[a-zA-Z] 匹配a-z小写字母或A-Z大写字母的任意一个

一.location 

location 通过前缀或正则匹配用户的URL访问路径做页面跳转、访问控制和代理转发

1.location 的分类

精确匹配 : location =  /  {.....}

一般匹配 : location  / {.....}

正则匹配 : location ~  /  {.....}

2. location 常用的匹配规则

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

3.location 优先级

相同类型的表达式,字符串长的会优先匹配

按优先级排列(从上往下排序)

(1)=  类型

(2)^~  类型表达式

(3)正则表达式 (~和~*)  类型

(4)常规字符串匹配类型,按前缀匹配

(5)通用匹配 (/) ,如果没有其它匹配,任何请求都会匹配到

4.location匹配机制

在没有合适的精准匹配的情况下,先看前缀匹配的长度,取最长匹配的location(如果此最长匹配是带有^~的则不再看正则匹配;如果此最长匹配是不带有^~的则会继续再看正则匹配)

前缀匹配看长度,最长的优先匹配;正则匹配看上下顺序,根据nginx配置文件的配置由上往下依次匹配,匹配到即停止

5.实际使用

实际网站使用中,至少有三个匹配规则定义:

(1)第一个必选规则

直接匹配网站根目录首页,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
可以是一个静态首页,也可以直接转发给后端应用服务器;

location = / {
    root 网页根目录;
	index index.html;
}


location = / {
    root   html;
	index  index.html index.htm;
}

(2)第二个必选规则

是处理静态文件请求,这是nginx作为http服务器的强项
通过目录缀匹配、文件名后缀匹配或通用匹配在nginx服务器本地处理

location ~ /static/ {
    root 目录;
}

location / {
    root 目录;
}


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

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

location / {
    root html;
}

(3)第三个规则

就是处理网站动态页面请求
通过匹配网页文件后缀用来转发带.php、.jsp后缀的动态请求到后端应用服务器处理

location \.php$ {
    fastcgi_pass PHP服务器地址:端口;
}

location \.jsp$ {
    proxy_pass TOMCAT服务器地址:端口;
}



location \.php$ {
    fastcgi_pass php_server:9000;
}

location \.jsp$ {
    proxy_pass http://tomcat_server;
}

二.Rewrite 地址重写

1.rewrite功能概述

就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求

rewrite 对用户的URL访问路径进行重写,在重定向跳转访问重写后的路径

 rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
例如 http://www.xy101.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

2.rewrite跳转实现

Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else

跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误

PCRE支持:perl兼容正则表达式的语法规则匹配

重写模块 set 指令:创建新的变量并设其值

(1)rewrite 执行顺序如下:

执行 server 块里面的 rewrite 指令。

 执行 location 匹配。

 执行选定的 location 中的 rewrite 指令。

(2)语法格式:

rewrite <regex> <replacement> [flag];

regex :表示正则匹配规则。

replacement :表示跳转后的内容。

flag :表示 rewrite 支持的 flag 标记。

(3)flag标记说明

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

3.rewrite 示例

(1)基于域名的跳转

现在公司旧域名www.xy101.com有业务需求变更,需要使用新域名www.xy102.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

配置设置

vim /usr/local/nginx/conf/nginx.conf

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

之后在本机上hosts文件内添加 域名和IP地址

192.168.80.10 www.xy101.com www.xy102.com

然后再重新启动nginx服务

systemctl restart nginx

 访问结果

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

(2)基于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.80.10访问正常。

配置设置

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

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

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-11 11:04:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-11 11:04:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-11 11:04:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-11 11:04:03       18 阅读

热门阅读

  1. 数据仓库技术及应用(Hive调优)

    2024-06-11 11:04:03       8 阅读
  2. 现代 C++的高效并发编程模式

    2024-06-11 11:04:03       9 阅读
  3. 2024.6.10刷题记录

    2024-06-11 11:04:03       13 阅读
  4. 三分的空间至关重要

    2024-06-11 11:04:03       7 阅读
  5. 【烟花game】

    2024-06-11 11:04:03       10 阅读
  6. 【DevOps】什么是 pfSense?免费构建SDWAN

    2024-06-11 11:04:03       12 阅读
  7. MATLAB入门教程

    2024-06-11 11:04:03       11 阅读
  8. PHP的基础代码

    2024-06-11 11:04:03       9 阅读