NGINX之location和rewrite

一.NGINX常用的正则表达式

二.Location

location作用:对访问的路径做访问控制或者代理转发

1.location 常用的匹配规则:

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

location 大致可以分为三类:
精准匹配:location = / {...}
一般匹配:location / {...}  一般匹配先匹配前缀匹配,最后在用通用匹配 
正则匹配:location ~ / {...}

2.location匹配机制:

优先级:精准匹配 =  >  最长前缀匹配 ^~  >  正则匹配 ~ ~* !~ !~*  >  一般前缀匹配 /XXXX  >  通用匹配 /   

意思:在没有精准匹配的情况下,先看最长的前缀匹配,取最长的前缀匹配,如果最长前缀匹配有^~则不继续看正则匹配了,如果最长前缀匹配没^~就要继续看正则匹配,匹配到及停止。

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

三.Rewrite

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

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

例如 http://www.xy101.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

rewrite跳转实现:
Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误

rewrite 执行顺序如下:

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

rewrite的语法格式:

第一种:

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

第二种:

$request_uri
if ($全局变量 ~ URL路径正则表达式) {
    rewrite  正则表达式  重写的地址  [标记位];
}

flag标记说明:

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

案例:

1.将请求http://www.xy101.com/abc/123.html 跳转到首页http://www.xy101.com

location /abc/123.html {
    root /var/www/html
    rewrite ^/ http://www.xy101.com;
}

22

2.将请求http://www.xy101.com/abc/test.jpg 跳转到http://www.xy101.com/error.png

location /abc/test.jpg {
    root    /var/www/html;
    rewrite ^/ error.png permanent;  
    }

3

3.将请求http://www.xy102.com/discuz/index.php 跳转到http://www.xy101.com/discuz/index.php ,保证原域名后面的uri路径不变 

if ($host = 'www.xy102.com') {
   rewrite ^/(.*)$ http://www.xy101.com/$1 permanent;
   }

4.将请求http://discuz.xy101.com/index.php 的访问跳转到http://www.xy101.com/discuz/index.php ,保证原域名后面的uri路径不变。

if ($host = discuz.xy101.com){
    rewrite ^/(.*)$ http://www.xy101.com/discuz/$1 permanent;
   }


 5.将对http://www.xy101.com 网站的所有请求跳转到自定义的维护页面或图片,本地可以访问

set $rewrite ture;
if ($remote_addr = "本地主机主机ip") {
   set rewirte false;
}

if (rewrite = true) {
    rewrite ^/weihu.html;
} 

location = /weihu.html {
   root /var/www/html;
}

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值