内容预知

1.Nginx中location与rewrite

1.1 location与rewrite常用的正则表达式

1.2  location与rewrite的联系和区别

2.location的匹配规则

2.1 location的匹配分类与常用规则

2.2 location 示例说明与规则优先实验

示例一:精准匹配

示例二:通用匹配

示例三:一般匹配

示例四: 正则匹配与前缀^~匹配

示例五:正则匹配与一般匹配

示例六:前缀^~匹配与一般匹配

2.3 location匹配规则顺序总结

2.4 location的运用拓展

3.rewrite 重写

3.1 rewrite 的功能介绍

3.2  rewrite的跳转实现与执行顺序

3.3 rewrite在nginx.conf 中的语法格式

3.4 rewrite运用示例

示例一:基于域名的跳转

示例二:基于客户端 IP 访问跳转

示例三:基于旧域名跳转到新域名后面加目录

示例四:基于参数匹配的跳转

示例五:基于目录下所有 php 结尾的文件跳转

示例六:基于最普通一条 url 请求的跳转


1.Nginx中location与rewrite

1.1 location与rewrite常用的正则表达式

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

1.2  location与rewrite的联系和区别

rewrite :对访问的域名或者域名内的URL路径地址重写
location:对访问的路径做访问控制或者代理转发

 从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

2.location的匹配规则

2.1 location的匹配分类与常用规则

location 大致可以分为三类:精准匹配" location = / {...} "   ,一般匹配" location / {...} "和正则匹配" location ~ / {...} "。在nginx.conf的配置文件中location默认使用的是通用匹配 "location /{.....}"。

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

2.2 location 示例说明与规则优先实验

示例一:精准匹配

location = / {
root /var/www/html}

 =为精确匹配 / ,主机名后面不能带任何字符串,例如想访问该location制定的匹配网页时,只能访问该主机IP或域名下的"/"(网页也只能存放在/var/www/html/ 下),而像"/abc,/data,/test"这一类和location等于号后面路径有任何一点差别的,都不会被匹配到。该匹配方式优先级最高,一旦匹配成功则立即采用


示例二:通用匹配 

location / {
root /var/www/html
}

 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求.用户只要是能访问到该主机的IP或域名,即使不输入路径,也能匹配到相关的网页信息。(文件只要是存放在/var/www/html 中,或则更深的目录也能被匹配到。例如:/var/www/html/test/ 下存放网页,用户访问/test 也能够匹配访问到相关网页)该匹配方式为location匹配中优先级最低的方式,只有其他location匹配方式均为成功,才会采用该方式


示例三:一般匹配 

#匹配规则a:
location /documents/ {
root  /var/www/html
index index.html
}#匹配规则b:
location /documents/abc {
root  /aaa/bbb/ccc
index index.html
}

 匹配规则a:匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

匹配规则b:匹配任何以 /documents/abc 开头的地址,匹配符合以后。还要继续往下搜索其它 location只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

 问题1:如果用户用户请求访问该nginx主机的 /documents/,会采用哪条匹配规则?

配置设置:

该实验阶段建议实验结束后,将匹配规则a和匹配规则b的上下关系进行调换再实验一次(实验两次,排除优先级是因为上下顺序导致的) 

 网页准备:

访问结果: 

结论:一般匹配时,location后面跟着的路径长度越长 ,则匹配的优先级越高

 问题2:如果规则a和规则b  location 后面跟着路径一样长时,用户访问该nginx主机的 /documents/,会采用哪条匹配规则?

#匹配规则alocation /documents/abc {root /aaa/bbb/ccc; index index.html ;}#匹配规则blocation /documents/test {root /var/www/html;index index.html;}

 访问网页准备:

访问测试: 

(1) 访问  /documents :

(2) 访问 /documents/abc:

 (3 ) 访问 /documents/test:

结论: 同长度的location 后面的路径,匹配规则不随规则设置的上下顺序而发生优先级改变。如果两则的后面路径有共同处(例如 /documents/test 和 /documents/abc  的共同处是 /documents ),则需要用户访问路径时填写的更加详细,否则无法找到网页 


示例四: 正则匹配与前缀^~匹配

 在 /var/www/html/images   下存放了一张 jpg格式的图片

#前缀^~匹配
location ^~ /images/ {
root /var/www/html}#正则匹配
location ~* \.(gif|jpg|jpeg)$ {/var/www/html
}

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

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

总结:^~ 前缀匹配是一种针对正则匹配的特殊的一般匹配方式 。前缀^~匹配在上面时:当访问的与前缀^~匹配相关时,就会停止正则匹配,采用该前缀匹配。正则匹配在上面时:当正则匹配匹配到请求时,还会继续查看其他的正则匹配。当遇到前缀^~匹配则会采用前缀匹配,而放弃该正则匹配。此外同是正则匹配的规则,看上下顺序决定优先级顺序


示例五:正则匹配与一般匹配

#正则匹配
location ~ /images/abc {
root /var/www/html
}#location后面路径更长的一般匹配
location /images/abc/1.html {
root /aaa/bbb/ccc
}

 匹配/images/abc/1.html 文件,location /images/abc/1.html 和正则location  ~ /images/abc 相比,正则优先级更高。匹配的网页是正则中的网页


示例六:前缀^~匹配与一般匹配

location ^~ /images/abc {
root /var/www/html}location /images/abc/1.html {
root /aaa/bbb/ccc
}

 因为前缀^~匹配时一般匹配的一种特殊存在,但是与一般匹配比较时,依旧遵循一般匹配的路径长度决定优先级的原则。 匹配/images/abc/1.html 文件,访问页面是下面的长路径一般匹配规则中设置的网页

2.3 location匹配规则顺序总结

在所有条件相同的条件下(location后面路径长度相同)优先级比较: 

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

location匹配规则优先通用的总结 :

  (1) 存在精准匹配时,直接采用

(2)在没有精准匹配的情况下,先看前缀匹配的长度,然后根据最长的前缀匹配的优先级去确定是否再去看其它正则匹配location。

(3)如果最长的前缀匹配带有 ^~ 则不再看其它正则匹配location,如果最长的前缀匹配是没有修饰符的一般匹配则会再看其它正则匹配location

(4)   前缀匹配看长度,最长的优先匹配
正则匹配看上下顺序,由上往下依次匹配,当有匹配成功时候,停止匹配,按当前匹配规则处理请求

(5)只有在精准、前缀、正则、一般 都没有匹配到的时候才会看通用匹配

2.4 location的运用拓展

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

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

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

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

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

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

location / {proxy_pass http://tomcat_server;
}

3.rewrite 重写

3.1 rewrite 的功能介绍

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

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

3.2  rewrite的跳转实现与执行顺序

rewrite跳转实现:
Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块 set 指令:创建新的变量并设其值

rewrite 执行顺序如下:
(1) 执行 server 块里面的 rewrite 指令。
(2) 执行 location 匹配。
(3) 执行选定的 location 中的 rewrite 指令

3.3 rewrite在nginx.conf 中的语法格式

语法格式:rewrite <regex> <replacement> [flag];

 regex :表示正则匹配规则。
replacement :表示跳转后的内容。
flag :表示 rewrite 支持的 flag 标记。

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

3.4 rewrite运用示例

示例一:基于域名的跳转 

需求:某公司旧域名www.yang.com有业务需求变更,需要使用新域名www.wang.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.yang.com-access.log;       #日志修改location / {#添加域名重定向if ($host = 'www.yang.com'){                        #$host为rewrite全局变量,代表请求主机头字段或主机名rewrite ^/(.*)$ http://www.wang.com/$1 permanent;    #$1为正则匹配的内容,即“域名/”之后的字符串}root   html;index  index.html index.htm;}
}

其他操作步骤: 

echo "192.168.73.105  www.yang.com www.wang.com" >> /etc/hosts
systemctl restart nginx
浏览器输入模拟访问 http://www.yang.com/test/1.html(虽然这个请求内容是不存在的)

实验结果:

会跳转到www.wang.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。


 示例二:基于客户端 IP 访问跳转

需求:某公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.73.105(指定的IP)访问正常。

配置设置 :

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.kgc.com;       #域名修改   charset utf-8;access_log  /var/log/nginx/www.yang.com-access.log;       #日志修改#设置是否合法的IP标记set $rewrite true;                         #设置变量$rewrite,变量值为boole值true#判断是否为合法IPif ($remote_addr = "192.168.73.105"){       #当客户端IP为192.168.73.105时,将变量值设为false,不进行重写set $rewrite false;}#除了合法IP,其它都是非法IP,进行重写跳转维护页面if ($rewrite = true){                      #当变量值为true时,进行重写rewrite (.+) /weihu.html;               #将域名后边的路径重写成/weihu.html后转发,例如www.kgc.com/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    #重启nginx服务

访问测试结果:

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

注意:如果rewrite (.+) /weihu.html; 换成rewrite (.+) /weihu.html permanent; 的话,若不是 192.168.73.105 的主机访问会使浏览器修改请求访问的 URL 成 http://www.yang.com/weihu.html 再请求访问,这样就会进入一直在 rewrite 的死循环,访问请求会一直被重写成 http://www.yang.com/weihu.html 再请求访问 


示例三:基于旧域名跳转到新域名后面加目录

需求:现在访问的是 http://yang.wang.com/post/,现在需要将这个域名下面的访问都跳转到http://www.yang.com/bbs/post/ 

 配置设置:

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

其他设置:

mkdir -p /usr/local/nginx/html/bbs/post
echo "this is 1.html"  >> /usr/local/nginx/html/bbs/post/1.html
echo "192.168.73.105 yang.wang.com"  >> /etc/hosts
systemctl restart nginx

访问结果:

使用浏览器访问 http://yang.wang.com/post/1.html 跳转到http://www.yang.com/bbs/post/1.html 


示例四:基于参数匹配的跳转

 需求:现在访问http://www.yang.com/100-(100|200)-100.html 跳转到http://www.yang.com页面

配置设置 :

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.yang.com;      #域名修改   charset utf-8;access_log  /var/log/nginx/www.yang.com-access.log;if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {rewrite (.+) http://www.yang.com permanent;}location / {root   html;index  index.html index.htm;}
}#############特殊变量说明##########################
$request_uri:包含请求参数的原始URI,不包含主机名,如:http://www.yang.com/abc/bbs/index.html?a=1&b=2 中的 /abc/bbs/index.php?a=1&b=2
$uri:这个变量指当前的请求URI,不包括任何参数,如:/abc/bbs/index.html
$document_uri:与$uri相同,这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html

 重启nginx服务,访问结果:

使用浏览器访问 http://www.yang.com/100-200-100.html 或 http://www.kgc.com/100-100-100.html 跳转到http://www.yang.com页面。


示例五:基于目录下所有 php 结尾的文件跳转

 需求:要求访问 http://www.yang.com/upload/123.php 跳转到首页。

配置设置:

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

访问结果:

浏览器访问 http://www.yang.com/upload/123.php 跳转到http://www.yang.com页面。


示例六:基于最普通一条 url 请求的跳转

 需求:要求访问一个具体的页面如 http://www.yang.com/abc/123.html 跳转到首页

配置设置:

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

访问结果:

浏览器访问 http://www.yang.com/abc/123.html 跳转到http://www.yang.com页面。

Nginx中的location规则与rewrite重写(详解)相关推荐

  1. web服务之Nginx中的location匹配与rewrite重写跳转

    文章目录 常见的Nginx正则表达式 location location分为三类 location常用的匹配规则 location 优先级 location 示例说明 三个匹配规则定义 rewrite ...

  2. Nginx的location匹配与rewrite重写跳转

    目录 Nginx的location匹配与rewrite重写跳转 一.常用的Nginx正则表达式 二.location 分类 location常用的匹配规则 优先级 location示例说明 Rewri ...

  3. Nginx 反向代理工作原理简介与配置详解

    Nginx 反向代理工作原理简介与配置详解 测试环境 CentOS 6.8-x86_64 nginx-1.10.0 下载地址:http://nginx.org/en/download.html 安装 ...

  4. Lucene打分规则与Similarity模块详解

    https://my.oschina.net/BreathL/blog/51498 搜索排序结果的控制 Lucnen作为搜索引擎中,应用最为广泛和成功的开源框架,它对搜索结果的排序,有一套十分完整的机 ...

  5. object类中的equals与自定义equals方法详解

    object类中的equals与自定义equal方法详解 1.this怎么理解?this == obj表示什么? this就是当前你new出来的对象,这里指谁调用equal方法this指的就是谁,ob ...

  6. python实例化是什么意思_Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

  7. 【C++】C++中的头文件(.h)—详解(2)

    接上... [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 头文件中写些什么 在上篇博客中写到头文件本身不参与编译,但是它们被包含到源文件中 ...

  8. 【C++】C++中的头文件(.h)—详解(1)

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 之前写过一篇<C++中头文件的使用>,那篇文章主要讲述C++中头文件的使用 ...

  9. tensorflow 读取cifar_对tensorflow中cifar-10文档的Read操作详解

    前言 在tensorflow的官方文档中得卷积神经网络一章,有一个使用cifar-10图片数据集的实验,搭建卷积神经网络倒不难,但是那个cifar10_input文件着实让我费了一番心思.配合着官方文 ...

最新文章

  1. 更好的内存管理-jemalloc (redis 默认使用的)
  2. pku 2954 Triangle pku 1265 Area Pick定理的应用 + 叉积求多边形面积
  3. 通用数据库管理工具DBeaver
  4. 【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 )
  5. python str输出到txt_Python 速学!不懂怎么入门python的小白看这篇就够了!
  6. 通过LDAP验证Active Directory服务
  7. 为什么虚拟机的linux系统IP是10.0.2.15
  8. java登录界面命令_Java命令行界面(第3部分):jbock
  9. 人工智能-机器学习之Selenium(chrome驱动,火狐驱动)
  10. 一道面试题:猫大叫了一声...
  11. SAP License:做系统要关注业务过程
  12. for循环十万条数据内存溢出_强如 Disruptor 也发生内存溢出?
  13. FindBoost 查找Boost的inlude目录和库
  14. System.Timers.Timer 与 System.Threading.Timer 小间隔
  15. 页面跳转_PyQt5多页面跳转
  16. MYSQL数据库日志
  17. 【linux命令】tar命令
  18. 在Hbuilder X中配置夜神模拟器
  19. 学术论文写作之引言(Introduction)怎么写
  20. 进击的UI--------------- UITableViewUITableView的移动

热门文章

  1. RFID智能档案管理系统 设计方案
  2. 活期账户10亿个+日均交易4亿笔,建设银行如何啃下系统转型的“硬骨头”?
  3. 会议系统m900服务器网口灯,中兴视频会议mcu服务器zxv10-m900
  4. 2075 Problem G 点菜问题
  5. 新手:linux环境配置以及linux下的pycharm安装
  6. python后端常见架构_常见的后端框架
  7. node爬取网易云歌曲
  8. 「力扣」第 546 题:移除盒子(很难的动态规划问题)
  9. 和平精英灵敏度分享码服务器没有响应,和平精英2021最稳灵敏度分享码完整推荐...
  10. CCF CSP 行车路线 java 201712_4