last和break问题以及https

来源:4-7 Rewrite规则_rewrite规则中的flag

慕妹2362023

2018-11-27

last和break我能理解是跳转,break匹配上了进行超找站点目录文件,如果不存在则403,如果存在则返回目录中的内容。
last匹配后,则是通过域名+location重新发起请求, 进行匹配。这些我都能理解。
我想问的是:
1.什么场景下使用break,什么场景下使用last,能否提供具体实际点的demo,让其理解起来更加的清晰。
2.https安全,安全在那里。经过我的测试,登陆网站发送的账号和密码还是明文的。那么这个https到底实现的是哪个地方的安全。能否举几个具体的例子更加深入的了解一下。
麻烦老师了!

写回答

1回答

Jeson

2018-12-02

  1. 什么场景下使用break,什么场景下使用last,能否提供具体实际点的demo,让其理解起来更加的清晰。

    last
       stops processing the current set of ngx_http_rewrite_module directives followed by a search for a new location matching the changed URI;

    break
       stops processing the current set of ngx_http_rewrite_module directives;
    typedef enum {
        NGX_HTTP_POST_READ_PHASE = 0,
        NGX_HTTP_SERVER_REWRITE_PHASE,
        NGX_HTTP_FIND_CONFIG_PHASE,
        NGX_HTTP_REWRITE_PHASE,           //rewrite阶段在这里
        NGX_HTTP_POST_REWRITE_PHASE,
        NGX_HTTP_PREACCESS_PHASE,
        NGX_HTTP_ACCESS_PHASE,
        NGX_HTTP_POST_ACCESS_PHASE,
        NGX_HTTP_TRY_FILES_PHASE,
        NGX_HTTP_CONTENT_PHASE,
        NGX_HTTP_LOG_PHASE
    } ngx_http_phases;
    server {
        listen 80 default_server;
        server_name dcshi.com;
        root www;

        location /break/ {
            rewrite ^/break/(.*) /test/$1 break;
            echo "break page";
        } 

        location /last/ {
             rewrite ^/last/(.*) /test/$1 last;
             echo "last page";
        }    

        location /test/ {
           echo "test page";
        }
    }

    last与break的区别如下:
    last: 停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一阶段开始执行…
    break:相对last,break并不会重新发起一个请求,只是跳过当前的rewrite阶段,并执行本请求后续的执行阶段…

    我们来看一个例子: 

     请求:http://dcshi.com/break/***
     输出: break page
     分析:正如上面讨论所说,break是跳过当前请求的rewrite阶段,并继续执行本请求的其他阶段,很明显,对于/foo 对应的content阶段的输出为 echo “break page”; (content阶段,可以简单理解为产生数据输出的阶段,如返回静态页面内容也是在content阶段;echo指令也是运行在content阶段,一般情况下content阶段只能对应一个输出指令,如同一个location配置两个echo,最终只会有一个echo指令被执行);当然如果你把/break/里的echo 指令注释,然后再次访问/break/xx会报404,这也跟我们预期一样:虽然/break/xx被重定向到/test/xx,但是break指令不会重新开启一个新的请求继续匹配,所以nginx是不会匹配到下面的/test/这个location;在echo指令被注释的情况下,/break/ 这location里只能执行nginx默认的content指令,即尝试找/test/xx这个html页面并输出起内容,事实上,这个页面不存在,所以会报404的错误。

   请求: http://dcshi.com/last/***
输出: test page
分析: last与break最大的不同是,last会重新发起一个新请求,并重新匹配location,所以对于/last,重新匹配请求以后会匹配到/test/,所以最终对应的content阶段的输出是test page;


2.https安全,安全在那里。经过我的测试,登陆网站发送的账号和密码还是明文的。那么这个https到底实现的是哪个地方的安全。能否举几个具体的例子更加深入的了解一下。

https和登陆账号明文没有关系,https保证的是传输包的安全,举例子来说:

用http的网站经常会遇到包遭到劫持和篡改,如果采用https的协议,由于数据在传输过程中是加密的,所以由于黑客得不到包文的解密秘钥,所以是窃取不到或者篡改数据报文的。

0
1
慕妹2362023
非常感谢!
2018-12-04
共1条回复

Nginx入门到实践-Nginx中间件应用+搭建Webserver架构

中间件、负载均衡、应用层安全防护、动静分离、Nginx+LUA开发等

4183 学习 · 908 问题

查看课程