3天精通nginx第二天-location、proxy_pass、rewrite详解

在这里插入图片描述

location规则【重要程度:★★★✰✰】

语法规则: location [=||*|^~] /uri/ {… }

符号含义
== 开头表示精确匹配
^~^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)
~~ 开头表示区分大小写的正则匹配
~*~* 开头表示不区分大小写的正则匹配
!和!*!和!*分别为区分大小写不匹配及不区分大小写不匹配的正则
/用户所使用的代理(一般为浏览器)

在这里插入图片描述

  1. 精确匹配和一般匹配

    location = /jqybpp {
    	rewrite ^/ /jqpp.html break;
    	root /com/jit/location;
    }
    location /jqybpp {
    	rewrite ^/ /ybpp.html break;
    	root /com/jit/location;
    }
    

    访问地址:http://localhost/jqybpp 访问地址的【/jqybpp】精确匹配到第一个规则,返回jqpp.html

    访问地址:http://localhost/jqybpp.html 访问地址的【jqybpp.html 】匹配第二个规则,返回ybdpp.html

  2. 一般匹配

    location /ybpp {
    	rewrite ^/ /ybdpp.html break;
    	root /com/jit/location;
    }
    location /ybpp/c {
    	rewrite ^/ /ybcpp.html break;
    	root /com/jit/location;
    }
    

    访问地址:http://localhost/ybpp访问地址的【/ybpp】匹配第一个规则,返回ybdpp.html

    访问地址:http://localhost/ybpp/c 访问地址的【/ybpp/c】既与第一个规则匹配,又与第二个规则匹配,这时以最长uri匹配优先,返回ybcpp.html

  3. 一般匹配与^~开头的非正则匹配

    location /ybkt/ktpp/d { 
    	rewrite ^/ /ybdpp.html break;
    	root /com/jit/location;
    }
    location ^~ /ybkt/ktpp {
    	rewrite ^/ /ktpp.html break;
    	root /com/jit/location;
    }
    

    访问地址:http://localhost/ybkt/ktpp/d 访问地址的【/ybkt/ktpp/d】既与第一个规则匹配,又与第二个规则匹配,这时以一般匹配优先,返回ybdpp.html

    访问地址:http://localhost/ybkt/ktpp 访问地址的【/ybkt/ktpp】匹配第二个规则,返回ktpp.html

  4. ^~开头的非正则匹配与正则表达式匹配

    location ~ /ktzz/ktpp/zzpp {
    	rewrite ^/ /zzpp1.html break;
    	root /com/jit/location;
    }
    
    location ^~ /ktzz/ktpp {
    	rewrite ^/ /ktpp.html break;
    	root /com/jit/location;
    }
    

    访问地址:http://localhost/ktzz/ktpp/zzpp 访问地址的【/ktzz/ktpp/zzpp】既与第一个规则匹配,又与第二个规则匹配,这时以^~优先,返回ktpp.html

  5. 一般匹配与正则表达式匹配

    location /ybzz/ybpp {
    	rewrite ^/ /ybcpp.html break;
    	root /com/jit/location;
    }
    location ~ /ybzz/ybpp/zzpp {
    	rewrite ^/ /zzpp.html break;
    	root /com/jit/location;
    }
    

    访问地址:http://localhost/ybzz/ybpp/zzpp 访问地址的【/b/d/a】匹配第二个规则,返回zzpp.html

  6. 正则表达式与正则表达式

    location ~ zzzz/zzpp {
    	rewrite ^/ /zzpp.html break;
    	root /com/jit/location;
    }
    location ~ zzzz/zzpp/1 {
    	rewrite ^/ /zzpp1.html break;
    	root /com/jit/location;
    } 
    

    访问地址:http://localhost/zzzz/zzpp/1 访问地址的【/zzzz/zzpp/1】匹配第一个规则,返回zzpp1.html

location规则总结:

  • 带有【=】的精确匹配优先,立即返回。
  • 普通匹配,如果命中多个,则记录【最长的规则】,如果存在正则表达式匹配,【由上至下开始匹配】,一旦匹配成功【1】个,【立即返回】结果,并结束解析过程,否则返回【最长的匹配】。
  • 一般匹配与^~开头的非正则匹配,一般匹配优先,但还需要考虑那个匹配最长。
  • / 为默认匹配,即如果没有匹配上其他的location,则最后匹配默认匹配的部分。

访问匹配示意图

在这里插入图片描述

root和alias区别【重要程度:★★★★✰】

root

root:在目录里找path1+path2路径,最后定位到的地址为: root路径+path1+path2

location / {
            root   /com/jit/static/html; 
			index  jit.html; # 默认访问首页文件
        }

访问:http://www.test.com:81,使用这种配置则访问到/com/jit/static/html/jit.html

alias

alias:在目录里找path2路径,最后定位到的地址为:alias地址+path2

location /image {  
		alias   /com/jit/static/image; 
	}

访问:http://www.test.com:81/image/one.jpg,使用这种配置则访问到/com/jit/static/image/one.jpg

proxy_pass详解【重要程度:★★★★✰】

在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。

以下情况都访问http://www.test.com:81/proxy/proxy.html。

  1. proxy_pass以【/】结尾
location /proxy1/ {  
	proxy_pass http://192.168.110.102:8081/;
}

代理到的url为:http://192.168.110.102:8081/proxy.html

  1. proxy_pass不以【/】结尾
location /proxy2/ {
	proxy_pass http://192.168.110.102:8081;
}

代理到的url为:http://192.168.110.102:8081/proxy1/proxy.html

  1. proxy_pass存在path以【/】结尾
location /proxy3/ {
	proxy_pass http://192.168.110.102:8081/gateway/;
}

代理到的url为:http://192.168.110.102:8081/gateway/proxy.html

  1. proxy_pass存在path不以【/】结尾
location /proxy4/ {
	proxy_pass http://192.168.110.102:8081/gateway;
}

代理到的url为:http://www.test.com:81/gatewayproxy.html

rewrite【重要程度:★★★✰✰】

rewrite语法格式及参数语法说明

在这里插入图片描述

Nginx配置rewrite
server {
        listen 80;
        server_name localhost;
        rewrite ^/(.*) http://192.168.110.102:8081/$1 permanent;  #` `$1表示路径中正则表达式匹配的第一个参数
}
}
server {
        listen 80;
        server_name localhost;
        if ( $host != 'www.test.com:81'  ) {
                rewrite ^/(.*) http://192.168.110.102:8081/$1 permanent; #` `$1表示路径中正则表达式匹配的第一个参数
        }
}
regex 常用正则表达式说明
字符描述
**将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“$”则匹配“$”
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*****匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o”
?匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,“?“等效于”{0,1}”
.匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式。
(pattern)匹配括号内pattern并可以在后面获取对应的匹配,常用$0…$9属性获取小括号中的匹配内容,要匹配圆括号字符需要(Content)

如果感觉这篇文章对您有帮助,可以给博主点赞、评论、收藏,这样是对博主最大的鼓励,谢谢。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孑疋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值