Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程。
分以下几种场景使用
1、地址跳转,用户访问一个URL,将其定向到另一个URL
2、协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式
3、伪静态,动态页面静态化,为了搜素引擎收录。
4、搜索引擎,SEO优化依赖于url路径,好记的url便于支持搜索引擎录入
Rewrite标记
每个Rewrite后面都有flag标记,主要有以下几种
flag | 规则 |
last | 停止当前匹配,并重新发送请求 |
barek | 终止匹配,不发送新请求 |
redirector | 临时跳转,关闭nginx请求就不跳转了,302 |
premanent | 永久跳转,访问过一次就不会访问原站了,301,第一次请求会保存缓存到浏览器中,通过浏览器缓存跳转 |
更改配置文件,准备代码文件进行测试last与break
1. [root@Web01 conf.d]# vim rewrite.conf 2. server { 3. listen 80; 4. server_name rewrite.koten.com; 5. root /code/rewrite/; 6. 7. location / { 8. rewrite /1.html /2.html; 9. rewrite /2.html /3.html; 10. } 11. 12. location /2.html { 13. rewrite /2.html /a.html; 14. } 15. 16. location /3.html { 17. rewrite /3.html /b.html; 18. "rewrite.conf" 18L, 343C written 19. [root@Web01 conf.d]# systemctl restart nginx 20. [root@Web01 conf.d]# mkdir -p /code/rewrite 21. [root@Web01 conf.d]# echo 1.html > /code/rewrite/1.html 22. [root@Web01 conf.d]# echo 2.html > /code/rewrite/2.html 23. [root@Web01 conf.d]# echo 3.html > /code/rewrite/3.html 24. [root@Web01 conf.d]# echo a.html > /code/rewrite/a.html 25. [root@Web01 conf.d]# echo b.html > /code/rewrite/b.html
发现访问1.html,实际重定向到了b.html
添加last标记
1. [root@Web01 conf.d]# vim rewrite.conf 2. server { 3. listen 80; 4. server_name rewrite.koten.com; 5. root /code/rewrite/; 6. 7. location / { 8. rewrite /1.html /2.html last; 9. rewrite /2.html /3.html; 10. } 11. 12. location /2.html { 13. rewrite /2.html /a.html; 14. } 15. 16. location /3.html { 17. rewrite /3.html /b.html; 18. "rewrite.conf" 18L, 348C written 19. [root@Web01 conf.d]# systemctl restart nginx
跳过了当前location,进行下一location重定向,最终跳转到a.html
添加down标记
1. [root@Web01 conf.d]# vim rewrite.conf 2. server { 3. listen 80; 4. server_name rewrite.koten.com; 5. root /code/rewrite/; 6. 7. location / { 8. rewrite /1.html /2.html break; 9. rewrite /2.html /3.html; 10. } 11. 12. location /2.html { 13. rewrite /2.html /a.html; 14. } 15. 16. location /3.html { 17. rewrite /3.html /b.html; 18. "rewrite.conf" 18L, 349C written 19. [root@Web01 conf.d]# systemctl restart nginx
break后不再进行重定向操作,最终定向到2.html
redirect与permanent测试
1. [root@Web01 conf.d]# vim rewrite.conf 2. server { 3. listen 80; 4. server_name rewrite.koten.com; 5. root /code; 6. 7. location /test { 8. #临时重定向 9. rewrite ^(.*)$ http://www.koten.vip redirect; 10. #return 302 http://www.koten.vip 11. 12. #永久重定向 13. #rewrite ^(.*)$ http://www.koten.vip permanent; 14. #return 301 http://www.koten.vip; 15. } 16. } 17. ~ 18. ~ 19. "rewrite.conf" 12L, 356C written 20. [root@Web01 conf.d]# systemctl restart nginx
访问rewrite.koten.com/test,定向到www.koten.vip
Rewrite使用案例
我们先开启rewrite日志对规则进行匹配调试
rewrite_log on; #加入到/etc/nginx/nginx.conf中
案例1:用户访问/abc/1.html实际上真实访问的是/ccc/bbb/2.html中
1. [root@Web01 conf.d]# mkdir -p /code/rewrite/ccc/bbb/ 2. [root@Web01 conf.d]# echo '/ccc/bbb/2.html' > /code/rewrite/ccc/bbb/2.html 3. [root@Web01 conf.d]# vim rewrite.conf 4. server { 5. listen 80; 6. server_name rewrite.koten.com; 7. root /code/rewrite; 8. 9. location /abc { 10. rewrite (.*) /ccc/bbb/2.html redirect; 11. #return 302 /ccc/bbb/2.html 12. } 13. } 14. ~ 15. ~ 16. ~ 17. ~ 18. ~ 19. "rewrite.conf" 10L, 217C written 20. [root@Web01 conf.d]# systemctl restart nginx
案例2:用户访问/2018/ccc/bbb/2.html实际上真实访问的是/2023/ccc/bbb.2.html
1. [root@Web01 conf.d]# mkdir -p /code/rewrite/2023/ccc/bbb/ 2. [root@Web01 conf.d]# echo '/2023/ccc/bbb/2.html' > /code/rewrite/2023/ccc/bbb/2.html 3. [root@Web01 conf.d]# vim rewrite.conf 4. server { 5. listen 80; 6. server_name rewrite.koten.com; 7. root /code/rewrite; 8. 9. location /2018 { 10. rewrite ^/2018/(.*) /2023/$1 redirect; 11. } 12. } 13. ~ 14. ~ 15. ~ 16. ~ 17. ~ 18. ~ 19. "rewrite.conf" 9L, 188C written 20. [root@Web01 conf.d]# systemctl restart nginx
案例3:用户访问/test实际上访问的是https://www.koten.vip
1. [root@Web01 conf.d]# vim rewrite.conf 2. server { 3. listen 80; 4. server_name rewrite.koten.com; 5. 6. location /test { 7. rewrite (.*) https://www.koten.vip redirect; 8. } 9. } 10. ~ 11. ~ 12. ~ 13. ~ 14. ~ 15. ~ 16. ~ 17. "rewrite.conf" 8L, 154C written 18. [root@Web01 conf.d]# systemctl restart nginx