再回首之Nginx(九) Rewrite规则


引言

Rewrite


Rewrite功能

Nginx Rewrite规则

  • 实现对URL的重写
  • 对匹配的URL进行重定向。

它的匹配依赖于正则表达式

场景

  • URL访问跳转,支持开发设计
    页面跳转、兼容性支持、展示效果等
  • SEO优化
  • 维护
    后台维护、流量转发
  • 安全

配置语法

Syntax:rewrite regex replacement[flag];
Default:--
Context:server,location,if

示例:

rewrite ^(.*)$ /pages/maintain.html break;

上面的示例使用场景:在对后端升级维护时,可将所有请求重定向到维护页面。


正则表达式

. 匹配除换行符以外的任意字符
? 重复0次或1次
+ 重复1次或多次
* 贪婪匹配,有多少就匹配多少
\d 匹配数字
^ 匹配字符串的开始
$ 匹配字符串的结束
{n} 重复n次
{n,} 重复n次或多次
[c] 匹配单个字符c
[a-z] 匹配a-z小写字母的任意一个
\ 转义字符
() 用于匹配括号之间的内容,通过$1、$2调用
rewrite index\.php$ /pages/maintain.html break;

if ($http_user_agent ~ MSIE){
  rewrite ^(.*)$ /msie/$1 break;
}

这里介绍一个终端工具:pcretest

再回首之Nginx(九) Rewrite规则_第1张图片
re> /(\d+)\.(\d+)\.(\d+)\.(\d+)/
data> 192.168.2.2

flag

标记位,标记nginx rewrite规则对应的类型

last 停止rewrite检测
break 停止rewrite检测
redirect 返回302临时重定向,地址栏会显示跳转后的地址
permanent 返回301永久重定向,地址栏会显示跳转后的地址
location ~ ^/break{
  rewrite ^/break/test/  break;
}
location ~ ^/last{
  rewrite ^/last/test/ last;
}
location  /test/{
  default_type application/json;
  return 200 '{"status":"success"}';
}

break 会停止向下扫描
而last如果找不到对应的资源文件会重新发起一个请求,继续向下匹配规则。

Rewrite改写规则使用场景

场景如下:

  • 假设我linux服务器上存在一个目录/opt/app/code,并且在此目录下有分层目录,如11/22/course_33.html
  • 即我们通过http://servername/course/11/22/course_33.html地址的访问可获取到资源
  • 因为本身Url地址过长,难以被SEO搜索并收录,因此要做rewrite改写。

打开test_rewrite.conf:

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    root /opt/app/code

    location / {
        rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/course_$3.hmtl break;
        if($http_user_agent ~* Chrome){
          rewrite ^/nginx http://coding.imooc.com/class/121.html redirect;
        }
        #-f的作用是判断这个路径是否存在
        if(!-f $request_filename){
          rewrite ^/(.*)$ http://www.imooc.com/class/$1 redirect;
        }
        index  index.html index.htm;
    }
}

Rewrite规则优先级

执行server块的rewrite指令
执行location匹配
执行选定的location中的rewrite

你可能感兴趣的:(再回首之Nginx(九) Rewrite规则)