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打开控制台,查看网络,如下:
Nginx学习笔记——rewrite规则
一个302临时重定向,一个200正常返回。
当关闭Nginx后,再次访问HOST/shen,则无响应。

(2)当flag=permanent,访问HOST/shen,跳转访问HOST/test/,url同时变化。F12打开控制台,查看网络,如下:
Nginx学习笔记——rewrite规则
一个301永久重定向,一个200正常访问。
当关闭Nginx服务器后,再次访问HOST/shen,则访问到HOST/test/,打开F12,看到301的永久重定向是from disk cache
Nginx学习笔记——rewrite规则
说明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

相关文章:

  • 2021-07-26
  • 2021-08-30
  • 2022-02-16
  • 2021-07-29
  • 2021-09-25
  • 2021-09-23
猜你喜欢
  • 2022-01-31
  • 2022-01-19
  • 2021-09-21
  • 2021-12-08
相关资源
相似解决方案