我是靠谱客的博主 着急耳机,这篇文章主要介绍nginx之URI重写与if的使用1.URI重写2.if,现在分享给大家,希望可以做个参考。

nginx URI重写与if的使用

  • 1.URI重写
    • 1.1.URI跟URL介绍
    • 1.2 rewrite使用方法
        • 1.2 网站目录不在默认html下
        • 1.3 rewrite 将URL重写
        • 1.4 flag
          • 1.4.1 last用法
          • 1.4.2 last与break的区别
  • 2.if
      • 2.1 基于浏览器实现分离案例
      • 2.2 防盗链案例

1.URI重写

1.1.URI跟URL介绍

URI:统一标识符,拿www.abc.com/aw/wd/举例,那么rui就是/aw/wd/这部分数据(也有可能是图片,html网页,如果是伪静态的话,那就得看配置是什么了


URL:统一定位符,还是拿www.abc.com/aw/wd/举例,那么整个www.abc.com/aw/wd/就是url


rewrite:重写是由ngx_http_rewrite_module模块提供,主要是实现URI改写功能,并且此模块是Nginx默认安装的模块。通过rewrite,用户可以实现url重定向,根据nginx规则来匹配内容跳转到replacement,结尾以flag标记。


1.2 rewrite使用方法


1.创建一个网页目录,里面有两张图
[root@zyy ~]# cd /usr/local/nginx/html/
[root@zyy zyy]# pwd
/usr/local/nginx/html/zyy

[root@zyy zyy]# ls
1.jpg  2.jpg  index.html





[root@zyy ~]# vim /usr/local/nginx/conf/nginx.conf

        location / {
           rewrite ^/test/(.*.jpg)$ /zyy/$1 last;    ##前面为重写后uri,后面为真实的uri
        }

        location /zyy {           ##指定真实网页位置
          root     html;
        }




解释
##rewrite ^/test/(.*.jpg)$ /zyy/$1 last;/zyy/$1($1为用户请求的资源名称)的uri重写为 ^/test/(.*.jpg)$
所以,只要用户输入http://192.168.30.244/test/1.jpg  就可以访问到/zyy/1.jpg的资源(前提是zyy目录下有)





当然我们其实也没必要写两个location,在当前location指定/zyy的位置
location / {
           root     html;
           rewrite ^/test/(.*.jpg)$ /zyy/$1 break;
       }








http://192.168.30.244/test/1.jpg
在这里插入图片描述

————————————————————————————————————————————————————

http://192.168.30.244/test2.jpg
在这里插入图片描述


1.2 网站目录不在默认html下

还有一种情况我们要重写URI的网站目录不在默认的html下


        location / {
           rewrite ^/test/(.*.jpg)$ /zyy/$1 last;
        }

        location /zyy {
           root    /tmp;          ##只需要在这个重新定义默认目录就可以了
        }






写成这样也可以
      location / {
           root     /tmp;
           rewrite ^/test/(.*.jpg)$ /zyy/$1 break;
       }




一些小问题

为什么写成这样,不可行?


        location / {
           rewrite ^/test/(.*.jpg)$ /zyy/$1 break;
        }

        location /zyy {
           root    /tmp;          ##只需要在这个重新定义默认目录就可以了
        }


查看error日志在这里插入图片描述
nginx去访问/usr/local/nginx/html/zyy/2.jpg
证明下面那个location根本没有生效,所以,我们需要将break改为last,或者在当前location定义网页目录



http://192.168.30.244/test/1.jpg
在这里插入图片描述

1.3 rewrite 将URL重写

location / {
        root  html;
           rewrite ^/test/(.*.jpg)$ https://image.baidu.com/search/detail?ct=503316480&z=undefined&tn=baiduimagedetail&ipn=d&word=journey&step_word=&ie=utf-8&in=&cl=2&lm=-1&st=undefined&hd=undefined&latest=undefined&copyright=undefined&cs=2264615217,3721323389&os=2563698849,602219563&simid=3338191960,239324301&pn=8&rn=1&di=42130&ln=1632&fr=&fmq=1597142538782_R&fm=&ic=undefined&s=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&is=0,0&istype=0&ist=&jit=&bdtype=0&spn=0&pi=0&gsm=0&objurl=http%3A%2F%2Fimg.9ku.com%2Fgeshoutuji%2Fsingertuji%2F6%2F6043%2F6043_9.jpg&rpstart=0&rpnum=0&adpicid=0&force=undefined  break;
       }



rewrite ^/test/(.*.jpg)$   ##后面跟url  break



http://192.168.30.244/test/1.jpg
在这里插入图片描述
————————————————————————————————————————————————————


在这里插入图片描述


1.4 flag

flag作用
last停止处理后续rewrite指令集,跳出location作用域,并开始搜索与更改后的URI相匹配的location,URL地址不变
break停止处理后续rewrite指令集,不会跳出location作用域,不再进行重新查找,终止匹配,URL地址不变
redirect返回302临时重定向,浏览器地址栏会显示跳转后的URL地址,爬虫不会更新URL
permanent返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫会更新URL



rewrite模块的作用是用来执行URL重定向。这个机制有利于去掉恶意访问的url,也有利于搜索引擎优化(SEO)

nginx使用的语法源于Perl兼容正则表达式(PCRE)库,基本语法如下:

标识符意义
^必须以^后的实体开头
$必须以$前的实体结尾
.匹配任意字符
[]匹配指定字符集内的任意字符
[^]匹配任何不包括在指定字符集内的任意字符串
|之前或之后的实体
()分组,组成一组用于匹配的实体,通常会有


1.4.1 last用法

[root@zyy ~]# vim /usr/local/nginx/conf/nginx.conf


       location / {
           rewrite ^/test/(.*.jpg)$ /111/$1 last;
       }

        location /111 {
           rewrite ^/111/(.*.jpg)$ /zyy/$1 last;
        }

        location /zyy {
           root html;
        }









网站目录不在默认html下
location / {
           root /tmp;
           rewrite ^/test/(.*.jpg)$ /111/$1 last;
       }

 location /111 {
           rewrite ^/111/(.*.jpg)$ /zyy/$1 last;
        }

在这里插入图片描述


1.4.2 last与break的区别
       location /break {
           rewrite ^/break/(.*)$ /zyy/$1 break;
       }

        location /last {
           rewrite ^/last/(.*)$ /zyy/$1 last;
           echo 'last';
       }

        location /zyy {
           echo 'test zyy';
       }


在这里插入图片描述
分析:
break:break并不会重新发起一个请求,只是跳过当前的rewrite阶段,并执行本请求location后续的执行阶段…

last:停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一阶段开始执行…


2.if


语法:if (condition) {…}


应用场景:

  • server段
  • location段

常见的condition

  • 变量名(变量值为空串,或者以“0”开始,则为false,其它的均为true)

  • 以变量为操作数构成的比较表达式(可使用=,!=类似的比较操作符进行测试)

  • 正则表达式的模式匹配操作
    • ~:区分大小写的模式匹配检查
    • ~*:不区分大小写的模式匹配检查
    • !~和!~*:对上面两种测试取反
  • 测试指定路径为文件的可能性(-f,!-f)
  • 测试指定路径为目录的可能性(-d,!-d)
  • 测试文件的存在性(-e,!-e)
  • 检查文件是否有执行权限(-x,!-x)


2.1 基于浏览器实现分离案例

创建firefox和chrome网站目录

[root@zyy html]# mkdir firefox
[root@zyy html]# vim firefox/index.html
firefox




[root@zyy html]# mkdir chrome
[root@zyy html]# vim chrome/index.html
chrome



       location / {
            if ($http_user_agent ~ Firefox) {        ## $http_user_agent用来区分用户设备(这里用来判断浏览器类型)
              rewrite ^(.*)$ /firefox/$1 break;         ##如果是Firefox,访问时的uri为/firefox/$1
            }

            if ($http_user_agent ~ Chrome) {
              rewrite ^(.*)$ /chrome/$1 break;     ##如果是chrome,访问时的uri为/chrome/$1
            }
        }

       location  /firefox {             ##指定firefox目录所在位置
            root    html;
            index  index.html;
        }

       location /chrome {                ##指定chrome目录所在位置
            root html;
            index   index.html;
        }








在Chrome上测试 http://192.168.30.244
在这里插入图片描述


在Firefox上测试 http://192.168.30.244
在这里插入图片描述


2.2 防盗链案例

location ~* .(jpg|gif|jpeg|png)$ {
  valid_referers none blocked www.idfsoft.com;
  if ($invalid_referer) {
    rewrite ^/ http://www.idfsoft.com/403.html;
  }
}

最后

以上就是着急耳机最近收集整理的关于nginx之URI重写与if的使用1.URI重写2.if的全部内容,更多相关nginx之URI重写与if内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部