Nginx的Location和Rewrite

目录

Rewrite简介

1.0 Rewrite实际场景

        1.1 Rewrite跳转场景

        1.2 Rewrite跳转实现

        1.3 Nginx正则表达式

        1.4 Rewrite命令&&语法格式

        1.5 flag标记说明 

2  Location分类

         2.1 Location优先级

3 Rewrite&&Location比较

4 场景跳转实验

4.1 基于域名的跳转


Rewrite简介

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

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用

例:https://mp.csdn.net/mp_block/creation/editor?spm=1000.2415.9901.5352

只能对除了域名和参数之外的字符/mp_block/creation/editor进行匹配

1.0 Rewrite实际场景

  • Nginx跳转需求的实现方式
  1. 使用rewrite进行匹配跳转
  2. 使用if匹配全局变量后跳转
  3. 使用location匹配再跳转
  • rewrite放在 server{},if{},location{} 段中
  1. location只对域名后边的除去传递参数外的字符串起作用
  • 对域名或参数字符串
  1. 使用if全局变量匹配
  2. 使用proxy_pass反向代理

1.1 Rewrite跳转场景

  • 使用rewrite进行匹配跳转
  • 使用if匹配全局变量后跳转
  • 使用location匹配再跳转

1.2 Rewrite跳转实现

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

1.3 Nginx正则表达式

符号 作用
~ 执行一个正则匹配,区分大小写
~* 执行一个正则匹配,不区分大小写
!~ 执行一个正则匹配,既不匹配全是大写,也不匹配全是小写
!~* 不匹配大小写不区分

  ^~

前缀匹配,普通字符匹配,只匹配第一个成功的结果

= 精确匹配
@ 定义一个命名的Location,使用在内部定向的时候
{n} n代表匹配次数
{n,} 匹配n次或更多次
{n,m} 重复 n 到 m 次
[ ] 定义匹配的字符范围
[c] 匹配单个字符 c
[a-z] 匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] 匹配所有大小写字母或数字
() 表达式的开始和结束位置
| 或运算符

1.4 Rewrite命令&&语法格式

rewrite    <regex>    <replacement>          [flag]
          正则表达式    跳转后的内容      rewrite支持的flag标记

1.5 flag标记说明 

  • last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中。

  • break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。

  • redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。

  • permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

  • set:当前规则匹配成功后设置一个变量,并把变量传入下一条规则

2  Location分类

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

2.1 Location优先级

3 Rewrite&&Location比较

rewrite :对访问的域名或者域名内的URL路径地址进行本地页面跳转
location:对访问的路径做访问控制或者跨服进行URL跳转

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

4 场景跳转实验

4.1 基于域名的跳转

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


   vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.lbj.com;			
	charset utf-8;
	access_log  /var/log/nginx/www.lbj.com-access.log;		
	location / {
	#添加域名重定向
        if ($host = 'www.lbj.com'){						
			rewrite ^/(.*)$ http://www.jokic.com/$1 permanent;	
        }
        root   html;
        index  index.html index.htm;
    }
}


echo "192.168.181.101 www.lbj.com www.jokic.com" >> /etc/hosts
systemctl restart nginx

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

猜你喜欢

转载自blog.csdn.net/Sp_Tizzy/article/details/131419042