Nginx实现Rewrite重写

什么是rewrite

Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程。

做伪静态,将动态页面url转换成静态的页面url。

Rewrite使用场景

  • 地址跳转

    • 比如淘宝的 www.taobao.com 由手机端访问会跳转成: main.m.taobao.com-
  • 协议跳转

  • 伪静态

    • 将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时建上动态URL地址对外暴露过多的参数,提升更高的安全性。
    • 搜索引擎,SEO优化依赖于url路径,好记的url便于智齿搜索引擎录入

伪静态的配置

句法:Syntax: rewrite regex replacement [flag]
默认:Default: --
语境:Context: server,location,if

rewrite:模块
regex:正则表达式(匹配当前的url)
replacement:要替换成的url
[flag]:要配置的fiag方式 没配的话也可以跳转 但不显示跳转以后的域名 还是你输入的域名 但不影响去匹配

rewrite https://wodeyumengouwo.com https://www.wodeyumengouwo.com;

#用于切换维护页面场景
#rewrite ^(.*)$ /page/maintain.html break;

如果懂shell脚本的,这两个就类似于脚本中的,break和continue

rewrite语法

 rewrite 正则表达式 新url或location [flag];

rewrite的fiag

概述 flag
匹配到last的规则后可以继续匹配后面的location(脚本中循环的break) last
匹配到break的规则后,无法再匹配后面的location(脚本中循环的continue) break
302临时重定向,不清理缓存的情况下,停掉nginx服务,页面无法跳 redirect
301永久重定向,不清理缓存的情况下,停掉nginx服务,页面继续跳转 permanent

redirect 临时重定向

# redirect临时重定向配置
[root@web01 ~]# vim /etc/nginx/conf.d/redirect.conf
server {
        listen 80;
        server_name redirect.hg.com;
        root /code;
        index index.html;

        location /test {
                rewrite ^(.*)$  https://www.baidu.com redirect;
        }
}

# 第二种配置 不走redirect的规则 直接由指定的uri跳转 也不会记录到日志 是写死的方法
[root@web01 ~]# vim /etc/nginx/conf.d/redirect.conf
server {
        listen 80;
        server_name redirect.hg.com;
        root /code;
        index index.html;

        location /test {
                #rewrite ^(.*)$  https://www.baidu.com redirect;
                return 307 http://baidu.com;
        }
}

# 重新加载nginx
[root@web01 ~]# systemctl reload nginx

# 域名解析
10.0.0.7 redirect.hg.com

#浏览器中输入 redirect.hg.com/test

临时重定向配置一结果

image-20231002222321297

临时重定向配置二结果

image-20231002222248415

permanent 永久重定向

# permanent永久重定向配置
[root@web01 ~]# vim /etc/nginx/conf.d/permanent.conf
server {
        listen 80;
        server_name permanent.hg.com;
        root /code;
        index index.html;

        location /test {
                rewrite ^(.*)$  https://www.baidu.com permanent;
        }
}

# 第二种配置 不走permanent的规则 直接由指定的uri跳转 也不会记录到日志 是写死的方法
[root@web01 ~]# vim /etc/nginx/conf.d/permanent.conf
server {
        listen 80;
        server_name permanent.hg.com;
        root /code;
        index index.html;

        location /test {
                #rewrite ^(.*)$  https://baidu.com permanent;
                return 307 http://www.baidu.com;
        }
}

# 重新加载nginx
[root@web01 ~]# systemctl reload nginx

# 域名解析
10.0.0.7 permanent.hg.com

#浏览器中输入 permanent.hg.com/test

永久重定向配置一结果

image-20231002221853045

永久重定向配置二结果

image-20231002222149375

break和last的配置方法

[root@web01 ~]# cat /etc/nginx/conf.d/rewrite.conf 
server {
        listen 80;
        server_name rewrite.hg.com;
        root /code;

        location ~ ^/break {
                rewrite ^/break /test/ break;
        }
        location ~ ^/last {
                rewrite ^/last /test/ last;
        }
        location /test/ {
                default_type app/json;
                return 200 "ok";
        }
}

## 当访问rewrite.hg.com/break 会匹配到break的规则后,无法再匹配后面的location 

## 当访问rewrite.hg.com/last 会匹配到last的规则 可以继续匹配后面的location

rewrite实践

开启rewrite日志方法

# 开启rewrite日志,错误日志的级别要改成 notice,在http层加上rewrite_log on;
[root@web01 ~]# vim /etc/nginx/nginx.conf
/var/log/nginx/error.log notice;

http{
    rewrite_log on;
    ...
}

# 重启nginx
[root@web01 nginx]# systemctl restart nginx

案例一

需求:用户访问 /abc/1.html 实际上真实访问的是 /ccc/bbb/2.html

[root@web01 ~]# vim /etc/nginx/conf.d/anliyi.conf
server {
        listen 80;
        server_name www.hg.com;
        root /code;
        index index.html;

        location /abc/1.html {
                rewrite ^(.*)$  /ccc/bbb/2.html redirect;
        }
}

# /abc/1.html是伪静态 不需要创建 但需要创建/ccc/bbb/2.html
[root@web01 ~]# mkdir -p /code/ccc/bbb
[root@web01 ~]# echo '666' > /code/ccc/bbb/2.html

# 重启nginx 
[root@web01 ~]# systemctl restart nginx

##写入域名解析 10.0.0.7 www.hg.com 打开浏览器访问www.hg.com/abc/1.html

image-20231002223942802

案例二

需求:用户访问 /2018/ccc/bbb/2.html 实际上真实访问的是 /2014/ccc/bbb/2.html 需要是变量数据 方便调用

# rewrite写死的方法
[root@web01 ~]# vim /etc/nginx/conf.d/anlier.conf
server {
        listen 80;
        server_name www.hg.com;
        root /code;
        index index.html;

        location /2018/ccc/bbb {
                rewrite ^(.*)$  /2014/ccc/bbb/2.html redirect;
        }
}

# 正则后向引用匹配
[root@web01 ~]# vim /etc/nginx/conf.d/anlier.conf
server {
        listen 80;
        server_name www.hg.com;
        root /code;
        index index.html;

        location /2018 {
                rewrite ^/2018/(.*)  /2014/$1 redirect;
        }
}

# /2018/ccc/bbb是伪静态 不需要创建 但需要创建/2014/ccc/bbb/2.html
[root@web01 ~]# mkdir -p /code/2014/ccc/bbb
[root@web01 ~]# echo '111' > /code/2014/ccc/bbb/2.html

# 重启nginx 并写入域名解析 10.0.0.7 www.hg.com 打开浏览器访问www.hg.com/2018/ccc/bbb/2.html

image-20231002224159032

案例三

需求:用户访问course-11-22-33.html实际上真实访问的是/course/11/22/33/course_33.html 需要是变量数据 方便调用

[root@web01 ~]# vim /etc/nginx/conf.d/anlisan.conf
server {
        listen 80;
        server_name www.hg.com;
        root /code;
        index index.html;

        location /course {
                rewrite course-(.*)-(.*)-(.*).html /course/$1/$2/$3/course_$3.html redirect;

        }
}

# 创建文件
[root@web01 ~]# mkdir -p /code/course/11/22/33/
[root@web01 ~]# echo '333' > /code/course/11/22/33/course_33.html

## 重启nginx 然后浏览器输入 www.hg.com/course-11-22-33.html 访问

image-20231002224756572

案例四

需求:80端口强制跳转443(安全证书)端口

server {
        listen 80;
        server_name www.wodeyumengouwo.com;
        rewrite ^(.*) https://$server_name redirect;
        #return 302 https://$server_name$request_uri;
}

rewrite做伪静态

## wordpress的伪静态重新规则如下:

if ( -f $request_filename/index.html ){
rewrite (.*) $1/index.html break;
}
if ( -f $request_filename/index.php ){
rewrite (.*) $1/index.php;
}
if ( !-f $request_filename ){
rewrite (.*) /index.php;
}

# 将以上内容加入到 /etc/nginx/conf.d/wp.conf 文件中 location / []里 并打开网站后台

image-20231002225144630