Nginx(十三)rewrite功能

一    ngx_http_rewrite_module模块

1)Nginx服务器利用'ngx_http_rewrite_module 模块'解析和处理rewrite请求,此功能依靠 'PCRE(perl compatible regularexpression)',因此编译之前要安装PCRE库

2)rewrite是nginx服务器的重要功能之一,用于实现'URL的重写'

3)URL的重写'应用场景':比如它可以在我们'改变网站结构'之后,'不需要客户端修改'原来的书签,也无需其他网站修改我们的链接,就可以设置为访问

4)另外还可以在一定程度上提高'网站的安全性'

rewrite规则

++++++++++++++'补充'++++++++++++++

1) '|'  -->用在(a|b)表示'或',任意匹配即可

2) '\'  -->反斜杠转义;nginx中一般把'元字符'转变为普通字符;'域名'匹配

 rewrite_log指令

设置'是否开启'记录ngx_http_rewrite_module模块日志记录到error_log日志文件当中,可以配置在'http、server、location或if'当中,需要'日志级别为notice'

备注: 调试时比较有用,可以看到'请求的次数'

Nginx的Rewrite规则编写实例

rewrite应用场景

二   关键标识

if、set、break、last、permanent、redirect、return

①    if

参考博客

官网说: if 是为 rewrite 服务的,一般在'location'中定义

应用场景: 结合'变量'和'正则表达式'来使用

用于'条件匹配'判断,并根据'条件判断结果'选择不同的Nginx配置,可以配置在'server或location块'中进行配置

备注:nginx的'if语法'仅能使用if做'单次判断','不支持'使用if else或者if elif这样的'多重判断','也不支持'多个条件逻辑'&&和||'处理,也不支持if的'嵌套'语法

正则匹配案例

set $domainWhitelist "yahoo\.com|google\.com|foo\.com";
if ($http_origin ~* "https?://([\w-]*\.)*($domainWhitelist)(:\d+)?") {
...
}

防盗链$http_referer

防盗链;其它参考;最佳参考

利用nginx限制HTTP的请求方法 

1)'^': 匹配字符串的'开始位置';
 
2) $ : 匹配字符串的'结束位置';
 
3).* : .匹配'任意单个字符'-->字符,'*'匹配'字符数量'-->'0到正无穷';
 
4)\. : 斜杠用来转义,'\.匹配 .' -->例如'匹配ip'就需要转义
 
5)(值1|值2|值3|值4):或匹配模式,例:'(jpg|gif|png|bmp)'匹配jpg或gif或png或bmp

rewrite可使用的全局变量

②    set

语法:setvariable value ; 

默认值:none; 

使用环境:'server,location,if';

功能: 指定key并给其'定义一个变量'

扩展用法: 变量可以调用Nginx'内置变量赋值给key'

表现形式: set定义格式为"set $key $value",及无论是key还是value都要'加$符号'

三    rewrite规则

1)rewrite指令

'作用域': server,location,if

rewrite按配置文件中出现的'顺序执行','flags标志'可以停止继续处理

+++++++++++++'flags参数'+++++++++++++

1)last  停止处理后续rewrite指令集,然后对'当前重写的新URI'在rewrite指令集上'重新查找'

2)break 停止处理后续rewrite指令集,'并不再重新查找',但是'当前location内'剩余'非rewrite语句'和'location外'的的'非rewrite语句'可以执行

3)redirect 返回'302临时'重定向

4)permant  返回'301永久'重定向

Nginx中rewrite指令注意事项

②    nginx rewrite指令执行顺序

1)执行'server块'的rewrite指令(这里的块指的是'server关键字后{}包围的区域')

2)执行'location匹配'

3)执行选定的'location中的rewrite'指令

备注:如果其中'某步URI被重写',则'重新循环执行1-3',直到找到'真实存在的文件'

注意:如果'循环超过10次',则'返回500 Internal Server Error'错误 -->可能'死循环'场景

http调转到https的三种方式 

③    last

环境: 'last、reak指令'主要是应用在'rewrite、return指令'中

+++++++++++'对比实验'+++++++++++

last 停止rewrite检测 【如果'没有匹配到',会'继续向下'匹配】

break 停止rewrite检测【如果'没有匹配到',则'不再向下'匹配,直接返回结果404】

redirect  返回302临时重定向,'地址栏'会'显示跳转后的地址'

permanent 返回301永久重定向,地址栏会'显示跳转后的地址'

对比前 

1)准备相应的资源文件

2)修改配置文件

3)测试

对比后

3)last 结论

1)url由'重写前'的http://nginx.wzj.com/aaa/index.html变为'重写后'的http://nginx.wzj.com/bbb/index.html

2)相当于'此时客户端的请求'是'http://nginx.wzj.com/bbb/index.html',会重新进行location匹配后,'匹配到第二个location条件',所以请求url'得到的响应是hello wold'

更准确的理解: 相当于'外部'发送了'两次请求'

注意: 而'不是/bbb/index.html'的'bbb'信息输出,'跨location'

④    break

1)用于'中断'当前'相同作用域'(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它'前面的配置生效',位于'后面的指令配置'就'不再生效了'

2)Nginx服务器在根据'配置处理请求的过程中'遇到该指令的时候,'回到上一层作用域'继续'向下读取'配置,该指令可以在'server块'和'location块'以及'if块'中使用

1)测试1 

location /login {
       
       default_type text/html;
       
       index index.html;
       
       #自定义一个变量"$name",其值为"wzj_110"
       set $name "wzj_110";
       
       说明:使用break后,其'下面的其它指令'将'不会继续执行'
       break;
       
       #自定义一个变量"$my_port",其值是通过调用Nginx内置变量"$server_port"得到的
       set $my_port $server_port;
       echo $name;
       echo $my_port;
}

2)死循环

 

3)接last的实验,将flags中last标识改成break

1)url由'重写前'的http://nginx.wzj.com/aaa/index.html变为'重写后'http://nginx.wzj.com/bbb/index.html

2)nginx按照'重写后的url'进行资源匹配,匹配到的'资源文件'是/usr/share/nginx/html/bbb/index.html

备注: 此时由于'break'不会进行新的location匹配,而把'重写后的url'请求作为服务器对应的'资源文件'进行查找,找不到则返回'404'错误

3)所以'原始请求url得到的响应'就是/usr/share/nginx/html/bbb/index.html'文件中的内容'--->'bbb'

⑤    nginx rewrite last和break区别

last  停止rewrite-->如果'没有匹配到',会继续'向下匹配',如果'匹配到',会'重新发起'匹配

break 停止rewrite-->如果'没有匹配到',则'不会向下匹配',返回404

实验的博客

配置rewrite 'last'时,请求'跳出当前location',进入server块,重新进行location匹配,'超过10次匹配不到'报500错误,客户端的url不变

配置rewrite 'break'时,请求'不会跳出'当前location,但'资源匹配会按照重写后的url进行',如果location里面'配置的是proxy_pass'到后端,'后端服务器'收到的请求url也会是'重写后的url',客户端的url不变

核心:当用'break修饰'的时候,表示'立即返回当前资源'

四   return

++++++++++++++'return指令'++++++++++++++

语法:return code;

return code URL;

'作用域':server,location,if

停止处理-->'并返回'指定状态码(code)给客户端

常使用: 403、404、500、503、504

特殊:非标准状态码'444'表示'关闭连接且不给客户端发响应头'

return 支持'响应URL重定向'(对于301,302,303,307),或者'文本响应'(对于其他状态码).对于文本或者URL重定向可以'包含变量'

+++++++++++++'应用场景'+++++++++++++

从nginx版本'0.8.2'开始支持,return用于完成对请求的处理,并'直接向客户端返回'响应状态码

场景: 其可以指定'重定向URL'(对于特殊重定向状态码,301/302等) 或者是'指定提示文本内容'(对于特殊状态码403/500等),处于此指令后的所有配置'都将不被执行'

五     nginx代理https强制http跳转https

①  方式一

说明: '官方推荐'-->80和443分别在'不同的server'中

server {
    listen 80;
    ...
    return 301 https://$server_name$request_uri;
    # rewrite ^(.*)$ https://$host$1 permanent;  -->'二者等价'
}

server {
    listen 443;
    ...
}

②  方式二

if ($scheme = 'http') {
    return 301 https://$server_name$request_uri;
}

'等价方式'

if ( $scheme = 'http' ){
   rewrite ^(.*)$  https://$host$1 permanent;
}

+++++++++++++++在'一个server段'里'同时监听80和443'端口+++++++++++++++

server {

            listen 80;

            listen 443;

            server_name www.wzj.com;

            ssl   on;

            ssl_certificate        /data/www-key/xxx.pem;

            ssl_certificate_key    /data/www-key/xxx.key;

            if ($scheme = http) {
                  return 301 https://$server_name$request_uri;
            }

}

可能出现的问题: 无论'是http还是https'都会'无限地重定向'下去,在这种情况下Chrome会报"重定向循环"的错误

六   nginx中 $1,$2,$3是什么

'( )' -->用于'匹配括号之间'的内容,通过'$1、$2'调用

参考博客

七  try_files

nginx配置选项try_files详解

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值