Nginx学习笔记——rewrite规则

Nginx的rewrite规则

实现url重写以及重定向。

场景

  1. URL访问跳转,支持开发设计
    页面跳转、兼容性支持、展示效果等
  2. SEO优化
  3. 维护
    后台维护、流量转发等
  4. 安全,使用rewrite可以实现伪静态

语法配置

Syntax:rewrite regex replacement [flag];
Default:默认无
Context:server,location,if

如:rewrite ^(.*)$ /pages/maintain.html breakl
解释:将所有的页面都改成维护页面,flag:break;

正则表达式

符号作用
.匹配除换行符以外的任意字符
?重复0次或1次
+重复1次或多次
*重复0次或多次
\d匹配数字
^匹配字符串的开始
$匹配字符串的结束
{n}重复n次
{n,}重复n次或更多次
[c]匹配单个字符c
[a-z]匹配a-z小写字符的任意一个
\转义字符
()用于匹配括号之间的内容,通过$1、$2调用

flag

类型作用
last停止rewrite检测
break停止rewrite检测
redirect返回302临时重定向,地址栏会显示跳转后的地址
permanent返回301永久重定向(缓存,下次访问,自动重定向),地址栏会显示跳转后的地址

测试

last与break的区别

/etc/nginx/conf.d/下新建一个配置,如下:

server {
    listen 80;
    server_name localhost;

    access_log  /var/log/nginx/log/host.access.log  main;

    root /opt/app/code;

    location ~ ^/break {
        rewrite ^/break /test/ break;
    }

    location ~ ^/last {
         rewrite ^/last /test/ last;
    }

    location /test/ {
       default_type application/json;
       return 200 '{"status":"success"}';
    }
}

测试效果

访问HOST/test/,正常访问,没问题。
访问HOST/break/,返回404页面找不到。
访问HOST/last/,正常访问,没问题。

区别
    location ~ ^/break {
        rewrite ^/break /test/ break;
    }

break:匹配到location后,直接从root目录下寻找改写后的链接资源,找到则返回,找不到则返回404页面未找到。

    location ~ ^/last {
         rewrite ^/last /test/ last;
    }

last:匹配到location后,改写字符串,内部相当于重新发起一次请求,然后进到别的location,执行正常流程。
区别:break直接找资源,last发起新的请求进入别的location。

redirect与last的区别

配置文件稍作修改:

    location ~ ^/last {
         #rewrite ^/last /test/ last;
         rewrite ^/last /test/ redirect;
    }

访问HOST/last/,正常访问,发现url变成HOST/test/
回顾flag=last,正常访问,但是url不变。
(1)当flag=redirect,使用curl -vL 192.168.174.132/last/进行测试,发现先请求的/last/,返回302,再请求的HOST/test/
(2)当flag=last,使用curl -vL 192.168.174.132/last/进行测试,返回200,直接可以获取到内容。

redirect与permanent的区别

    location ~ ^/shen {
        #rewrite ^/shen http://192.168.174.132/test/ permanent;
        rewrite ^/shen http://192.168.174.132/test/ redirect;
    }

(1)当flag=redirect,访问HOST/shen,跳转访问HOST/test/,url同时变化。F12打开控制台,查看网络,如下:
在这里插入图片描述
一个302临时重定向,一个200正常返回。
当关闭Nginx后,再次访问HOST/shen,则无响应。

(2)当flag=permanent,访问HOST/shen,跳转访问HOST/test/,url同时变化。F12打开控制台,查看网络,如下:
在这里插入图片描述
一个301永久重定向,一个200正常访问。
当关闭Nginx服务器后,再次访问HOST/shen,则访问到HOST/test/,打开F12,看到301的永久重定向是from disk cache
在这里插入图片描述
说明301永久重定向,是可以缓存的。

rewrite重写规则适用场景

过长的目录结构,不便于搜索引擎收录

配置项:

location / {
        rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/course_$3.html break;
    }

当目录结构复杂的时候,嵌套过深,不便于搜索引擎去收录,则可以利用重写规则去重写。
此处flag=break,直接去对应目录下找到资源,返回给客户端($1等是调用前面的正则表达式的括号匹配内容)。

如:访问http://192.168.174.132/course-11-22-33.html,则会去$root目录下寻找/course/11/22/course_33.html,返回给客户端。

对于不同浏览器,进行兼容性跳转

        if ($http_user_agent ~* Chrome) {
            rewrite ^/nginx http:/www.baidu.com redirect;
        }

若浏览器是Chrome,则重定向到指定资源或页面。

若请求资源不存在,则重定向到指定页面

        if (!-f $request_filename) {
            rewrite ^/(.*)$ http://www.baidu.com/s?wd=$1+$request_filename redirect;
        }

if语句的意思是,若$root+request_uri这个资源文件不存在,则重定向。

rewrite规则优先级

Server>location>指定location

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值