1.Rewrite基本概述

rewrite主要实现url地址重写, 以及重定向.

Rewrite使用场景
1.URL访问跳转: 支持开发设计, 页面跳转, 兼容性支持, 展示效果
2.SEO优化: 依赖于url路径,以便支持搜索引擎录入
3.维护: 后台维护, 流量转发等
4.安全: 伪静态,真实动态页面进行伪装

2.Rewrite配置语法

Syntax: rewrite regex replacement [flag];
Default: --
Context: server, location, if
//所有请求转发至/pages/maintain.html
rewrite ^(.*)$ /pages/maintain.html break;

正则表达式

正则表达式中特殊字符

\ 转义字符
rewrite index\.php$ /pages/maintain.html break;
() 用于匹配括号之间的内容, 通过$1,$2调用
if ($http_user_agent ~ Chrome){
    rewrite ^(.*)$ /chrome/$1 break;
}

正则表达式终端测试工具

[root@Nginx ~]# yum install -y pcre-tools
[root@Nginx ~]# pcretest 
PCRE version 8.32 2012-11-30
re> /(\d+)\.(\d+)\.(\d+)\.(\d+)/
data> 192.168.56.11
 0: 192.168.56.11
 1: 192
 2: 168
 3: 56
 4: 11

3.Rewrite标记Flag

对比flag中break与last

[root@Nginx ~]# cat /etc/nginx/conf.d/rewrite.conf 
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 application/json;
        return 200 '{"status":"success"}';
   }
}

测试break

测试last

last与break对比总结:
last会新建立一个请求, 请求域名+/test
break匹配后不会进行匹配, 会查找对应root站点目录下包含/test目录
对比flag中redirect与permanent

[root@Nginx ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
    listen 80;
    server_name localhost;
    root /soft/code;

    location ~ ^/bgx {
        rewrite ^/bgx http://kt.xuliangwei.com redirect;
        rewrite ^/bgx http://kt.xuliangwei.com permanent;
    }

测试Nginx中redirect

nginx -s stop停止Nginx服务

测试Nginx中permanent

nginx -s stop停止Nginx服务

4.Rewrite使用场景

第一种场景

ls /soft/code/course/11/22/course_33.html
location / {
    rewrite ^/course-(\d+)-(\d+)-(\d+)\.html /course/$1/$2/course_$3.html break;
}

第二种场景

if ($http_user_agent ~* Chrome){
    rewrite ^/nginx http://kt.xuliangwei.com/index.html redirect;
}

5.Rewrite额外补充

Rewrite匹配优先级
1.执行server块的rewrite指令
2.执行location匹配
3.执行选定的location中的rewrite

Rewrite优雅书写

server {
    listen 80;
    server_name www.bgx.com bgx.com;
    if ($http_host = nginx.org){
    rewrite (.*) http://www.bgx.com$1;
    }
}
//改良版
server {
    listen 80;
    server_name bgx.com;
    rewrite ^ http://www.bgx.com$request_uri?;
}
server {
    listen 80;
    server_name www.bgx.com;
}

第三种场景

location ~* ^/api/.*$ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://openapi.mcake.com;
}

location / { 
   if (!-e $request_filename) {
       rewrite  ^(.*)$  /index.php?s=$1  last;
       break;
    }
 }
文档更新时间: 2019-07-09 12:51   作者:李延召