【无标题】

  • nginx的rewrite

    • 反向代理

    • nginx作为反向代理服务器的首选,会遇到各种各样的跳转任务,并且nginx的跳转效率会更高。

    • 跳转功能的实现通过ngx_http_rewrite_module来实现,支持if条件判断,但不支持else,需要pcre支持,跳转次数最多不超过10次。超过返回500状态码,支持set自定义变量

    • 实现方式

      • 直接写rewrite匹配进行跳转

      • 通过if语句进行判断后在进行rewrite

      • 通过location匹配后在跳转,这种方式rewrite只能放在server中,或者location中

        • location按照优先级从上到下分类

          • location = 匹配条件 {重写规则}

            • 精准匹配

          • location ~ 匹配条件 {重写规则}

            • 正则匹配

              • ~

                • 区分大小写

              • ~*

                • 不区分大小写

              • !~

                • 区分大小写但不匹配

              • !~*

                • 不区分大小写并且不匹配

              • ^~

                • 表示普通字符匹配

                  • 使用前缀进行匹配,匹配成功即停止

              • =

                • 字符精准匹配(完全匹配)

          • location 匹配条件

            • 一般匹配

          • 优先级

    • 语法

      • rewrite<regex><replacement>[flag];

    • 案例实现

      • 以下所有案例基本都要求在站点内实现,所以书写内容应该在站点内容之内,也就是location站点{ }内。

        • 常见正则表达式元字符

      • 公司网站更换域名,要求旧网站不能废除,也就是做站点迁移。

        • 从一个域名跳转到另一个域名,也就是基于域名的跳转,

          • 基于域名

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

              • 解释:如果匹配到的url是www.benet.com那么通过地址重写的方式重定向到www.accp.com。

              • $host:日志记录中的访问者填写的url部分

                  • 用IP访问

                  • 用域名访问

              • 重写规则:rewrite 重写前的内容 重写后的内容 flag标记

                • 常用的flag标记(相当于apache中[条件标识])

                  • last:标识完成rewrite

                  • break:本条规则匹配完成即终止,不在匹配后面的任何规则

                  • redirect:302临时重定向,爬虫不会更新url

                  • permanent:301永久重定向,爬虫更新url

              • ^/(.*)$

                • ^:表示以什么开头

                • /:表示请求url后紧跟的那个/,例www.xingchen.com/中的“/”

                • ():表示定位边界

                • .*:表示/后不管跟任何字符都能匹配

                • $:以什么结尾

              • 需要注意因为表示的是判断,因此if()中的=号两边要有空格。

      • 公司要更新维护网站,要求内部管理员主机能够访问该网站,其他任何人访问都要跳转到维护网站上。

        • 无法针对域名做区分,可以区分的是IP,做到仅允许特定IP可以访问就可以。

          • 基于IP地址

            • set $rewrite true; if ($remote_addr = "192.168.10.51") { set $rewrite false; } if ($rewrite = true) { rewrite (.+) /weihu.html; }

              • 首先定义了一个变量值为true 再做判断,如果是我允许的IP地址来访为,将值设置为false。不做处理 如果是其他的做出判断成功,那么要进行重写,

              • (.+)表示匹配整个url,匹配成功后就在后面加上/weihu.html。

      • 如果将子目录写在前面例:bbs.benet.com/post,其正确写法应该是www.benet.com/bbs/post

        • 不正规的写法,或者不用更改添加出新的域名,需要有这种需求

          • location /post { rewrite (.+) http://www.benet.com/bbs$1 permanent; }

            • 通过location定义来匹配/后为post的url。达成匹配条件后要进行地址重写。

            • $1:表示/后用户输入的字符串,用(.+)进行标识。可以这么说$1所代表的内容就是(.+)的内容,$1是默认带/的,这点要尤其注意。

          • 需要在DNS中或者hosts解析目录中添加该方式所对应的解析条目。

      • 基于uri进行跳转

        • 访问端由明确的uri参数,需要将这种参数进行重写

          • if ($request_uri ~ ^/100-(100|200)-(\d+).html$) { rewrite (.*) http://www.benet.com permanent; }

            • $request_uri:表示提取整个uri部分

            • ^/100-(100|200)-(\d+).html$) :表示不管/前缀是什么,/后的后缀名的匹配条件。

              • 可以将每一个-左右的数字都写成通配表达。

            • \d:表示匹配任意数字

      • 伪动态的域名跳转,也就是将后缀为.php的url请求重写成静态的url

        • location ~* /aaa/(.*)\.php$ { rewrite (.*) http://www.benet.com permanent; }

      • 精准请求的url进行跳转

        • location ~* ^/1/test.html { rewrite (.+) http://www.benet.com permanent; }

          • url不限制,但是对后缀进行了精准的匹配

    • 总结

      • 地址重写的思路

        • 用各种正则表达式或者判断语句,将想要进行地址重写的url匹配到,这是难点,也是重点。 重写规则好写。

      • if与set要灵活使用

        • 当你需要进行两种条件的匹配那么建议用if语句先判断。后进行重写。

        • 如果匹配条件只有一个那么可以使用location进行匹配。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值