博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Nginx基础 - 08路径Rewrite

Posted on 2023-03-11 18:53  Kingdomer  阅读(122)  评论(0编辑  收藏  举报

 

一、 Rewrite 基本描述

rewrite 主要实现 url 地址重写,以及重定向。
 
使用场景
  • URL 访问跳转: 支持开发设计,页面跳转,兼容性支持

  • SEO 优化: 依赖于url路径,以便支持搜索引擎录入

  • 维护: 后台维护,流量转发等

  • 安全: 伪静态,真实动态页面进行伪装

 

二、 Rewrite 配置语法

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

 

rewrite ^(.*)$ /pages/maintain.html break;   // 所有请求转发至 /pages/maintain.html break;
 
2.1 正则表达式
表达式
 
.
匹配除换行符以外的任意字符
重复0次或1次
+
重复1次或更多次
*
任意次数
\d
匹配数字
^
匹配字符串的开始
$
匹配字符串的结尾
{n}
重复n次
{n+}
重复n次或更多次

 

2.2 正则表达式中的特殊字符

\ : 转义字符
rewrite index.php$ /pages/index.php break;
() :用于匹配括号之间的内容,通过 $1、$2调用
if ($http_user_agent ~ Chrome) {
    rewrite ^(.*)$ /chrome/$1 break;
}
--> 实现效果:
http://localhost/test001.html  --> http://localhost/chrome/test001.html

  

2.3 正则表达式终端测试工具

# yum install -y pcre-tools
# pcretest
re> /(\d+)\.(\d+)\.(\d+)\.(\d+)/
data> 192.168.10.19
 0: 192.168.10.19
 1: 192
 2: 168
 3: 10
 4: 19

  

三、 Rewrite 标记Flag

flag
 
last
停止rewrite检测
break
停止rewrite检测
redirect
返回302临时重定向,地址栏会显示跳转后的地址
permanent
返回301永久重定向,地址栏会显示跳转后的地址
 

3.1 对比flag中 break 与 last

last  会新建立一个请求,请求域名+/test

break 匹配后不会进行匹配,会查找对应的root站点目录下包含 /test 目录

server {
    listen 80;
    server_name localhost;
    root /soft/code;
    location ~ ^/break {
        rewrite ^/break /test/ break;
    }
    location ~ ^/last {
        rewrite ^/last /test/ last;
    }
    location /test/ {
        default_type applicaiton/json;
        return 200 '{"status":"success"}';
    }  
}

  

3.2 比对flag中 redirect 与 permanent
permanent 跳转,在关闭掉Nginx服务器后,浏览器依旧可以跳转,但清除缓存后,不能跳转
server {
    listen 80;
    server_name localhost;
    root /soft/code;
    location ~ ^/px {
        rewrite ^/px http://king.bearpx.com redirect;
        rewrite ^/px http://king.bearpx.com permanent;
    }
}

  

四、 Rewtire使用场景

当对外展示URI时,需要隐藏真实目录结构
server {
    listen 80;
    server_name localhost;
    root /soft/code;
    index index.html;
    location / {
        rewrite ^/px-(\d+)-(\d+)\.html /px/$1/px_$2.html break;
    }
}

  

当Chrome浏览器访问/px时,直接跳转到 index.html;
server {
    if($http_user_agent ~* Chrome){
        rewrite ^/px http://px.bearpx.com/index.html redirect;
    }
}

 

五、Rewrite 匹配优先级

  • 执行server块的 rewrite指令
  • 执行location匹配
  • 执行选定的location中的rewrite
 
5.1 Rewrite 优雅书写
server {
    listen 80;
    server_name www.bearpx.com bearpx.com;
    if ($http_host = nginx.org){
        rewrite (.*) http://www.bearpx.com$1;
    }
}

// 改进写法
server {
    listen 80;
    server_name www.bearpx.com bearpx.com;
    rewrite ^ http://www.bearpx.com$request_uri?;

}

--> 实现效果
bearpx.com/bear/bear.html  --> http://www.bearpx.com/bear/bear.html