Rewrite基本概述
1.Rewrite
Rewrite即URL重写,主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他URL的过程。
2.Rewrite使用场景
1).URL地址跳转,例如用户访问old.com将其跳转到oldboy.com,或者当用户通过http的方式访问old.com时,将其跳转至https的方式
访问oldboy.com
2).URL伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同shi减少动态URL地址对外暴露过多的参数,提升
更高的安全性。
3).搜索引擎SEO优化依赖于URL路径,以便支持搜索引擎录入。
4).可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
安装chrom的http status 插件
Rewrite配置语法
Syntax: rewrite regex replacement [flag]; Default: — Context: server, location, if
例:http://localhost:88/test1/test2/test.php $host: localhost $server_port: 80 $request_uri: http://localhost:88/test1/test2/test.php $document_uri: /test1/test2/test.php $document_root: /var/www/html $request_filename: /var/www/html/test1/test2/test.php
Rewrite匹配优先级
1.执行server块的rewrite指令 2.执行location匹配 3.执行选定的location中的rewrite
开启Nginx的Rewrite
vim /etc/nginx/nginx.conf #1.设置nginx的错误日志级别为notice error_log /var/log/nginx/error.log notice; #2.在http模块层,增加一行rewrite_log日志 http { ...... rewrite_log on; ...... }
例1:访问blog.xiao.com则跳转至www.baidu.com
vim wordpress.conf server { listen 80; server_name blog.xiao.com; root /code/wordpress; index index.php; location / { rewrite ^/ https://www.baidu.com; } location ~ \.php$ { root /code/wordpress; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
例2: 用户访问/abc/1.html实际上真实访问/ccc/bbb/2.html
配置一: [root@web01 conf.d]# cat rewrite.conf server { listen 80; server_name rewrite.xiao.com; root /code; index index.html; location ~* /abc/1.html { rewrite /abc/1.html /bbb/ccc/index.html; } } 配置优化一: [root@web01 conf.d]# cat rewrite.conf server { listen 80; server_name rewrite.xiao.com; root /code; index index.html; location ~* /abc/1.html { rewrite .* /bbb/ccc/index.html; } } 配置优化二: server { listen 80; server_name rewrite.xiao.com; root /code; index index.html; location ~* /abc/1.html { #这两行都是302跳转,不要一起配置 #rewrite .* /bbb/ccc/index.html redirect; return 302 /bbb/ccc/index.html; } }
例3: 用户访问/2018/ccc/bbb/2.html实际真实访问是/2014/ccc/bbb/2.html
# http://rewrite.xiao.com/2018/ccc/bbb/2.html =》http://rewrite.xiao.com/2014/ccc/bbb/2.html 1.准备真实的目录及文件 [root@web01 conf.d]# mkdir -p /code/2014/ccc/bbb [root@web01 conf.d]# echo "2014_bbb_ccc" > /code/2014/ccc/bbb/2.html 2.添加rewrite的Nginx的配置文件 [root@web01 conf.d]# cat rewrite.conf server { listen 80; server_name rewrite.xiao.com; root /code; index index.html; location /2018 { rewrite ^/2018/(.*)$ /2014/$1 redirect; } }
例4:用户访问/test目录下任何内容,实际上真实访问是https://www.baidu.com
location /test { rewrite (.*) https://www.baidu.com redirect; } 泛域名 *.xxx.com
例5: 用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
# http://www.xiao.com/course-11-22-33.html ==》http://www.xiao.com/course/11/22/33/course_33.html 1.准备真实的目录及文件 [root@web01 conf.d]# mkdir -p /code/course/11/22/33 [root@web01 conf.d]# echo "course 112233" > /code/course/11/22/33/course_33.html 2.添加rewrite的Nginx的配置文件 [root@web01 conf.d]# cat rewrite.conf server { listen 80; server_name rewrite.xiao.com; root /code; index index.html; location / { #灵活 rewrite ^/(.*)-(.*)-(.*)-(.*).html$ /$1/$2/$3/$4/$1_$4.html redirect; #固定 #rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect; } }
例6:将http请求,跳转至https
server { listen 80; server_name xiao.com; rewrite ^(.*) https://$server_name$1 redirect; #return 302 https://$request_uri; } server { listen 443; server_name xiao.com; ssl on; }
Rewrite标记Flag
rewrite指令根据表达式来重定向URL,或者修改字符串。可以应用于server,location,if环境下,每行rewrite指令最后跟一个flag标记,
支持的flag标记如下表格所示:
flag last 本条规则匹配完成后,停止匹配,不在匹配后面的规则 break 本条规则匹配完成后,停止匹配,继续匹配后面的规则 redirect 返回302临时重定向,地址栏会显示跳转后的地址 permanent 返回301永久重定向,地址栏会显示跳转后的地址
last与break对比总结
last 1.last进行Rewrite匹配成功,停止当前这个请求,并根据rewrite匹配的规则重新向Server发起一个请求。 2.新请求的内容是域名+URL,对应的地址为www.xiao.com/2017-old break 1.break进行Rewrite匹配成功后,不会像last重新发起请求,首先查找站点目录下/code/2017_new/默认返回页是否存在,如不存在则404,如存在 继续往下匹配 2.根据Rewrite匹配的规则,跳转至www.xiao.com/2017_old/的URL地址,匹配成功后则不继续匹配
[root@web01 conf.d]# cat rewrite.conf server { listen 80; server_name rewrite.xiao.com; root /code; index index.html; location ~ ^/2019_new { rewrite ^/2019_new /2017_old break; } location ~ ^/2019_new { rewrite ^/2019_new /bbb/ccc/index.html redirect; } location ~ ^/2020_new { rewrite ^/2020_new /2017_old break; } location ~ /2017_old { index index.html; } }