09. Nginx进阶-Rewrite

简介

什么是rewrite?

rewrite即URL重写,主要实现URL地址重写,以及重定向。
就是把插入web的请求重定向到其他URL的过程。

rewrite使用场景

  1. URL地址调整

例如用户访问wang.mingqu.com将其跳转到ming.mingqu.com。
或者当用户通过http的方式访问wang.mingqu.com时,将其跳转至https的方式访问ming.mingqu.com

  1. URL伪静态

将动态页面显示未静态页面方式的一种技术。
便于搜索引擎的录入,同时减少动态URL地址对我暴漏过多参数,提升更高的安全性。

  1. 搜索引擎SEO优化依赖于URL路径,以便于搜索引擎录入。
  2. 可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。

rewrite基本语法

语法格式

rewrite regex replacement [flag];
rewrite 正则表达式 替换内容 标记;

适用范围

server,针对某个网站的重定向。
location,针对某个页面的重定向。
if,或者使用if语句判断是否重定向。

表达式元字符

字符说明
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
?匹配前面的字符零次或一次
.匹配除"\n"之外的任何单个字符
\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用字符
\d匹配纯数字
{n}重复n次
{n,}重复n次或更多次
[c]匹配单个字符c
[a-z]匹配a到z的小写字母的任意一个
[a-zA-Z]匹配a到z的小写字母或A到Z的大写字母的任意一个
()表达式的开始和结束位置
|或运算符

标记说明

标记说明特点
last相当于apache的[L]标记,表示完成rewrite在本条规则完成后,继续向下匹配新的location URL规则,一般或者用在server和if当中。
break本条规则匹配完成即终止,不在匹配后面的任何规则break在location下面用的多,与last类似,但是不会重新发起一次处理过程,而是直接放回处理结果
redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url该标记表示当前规则匹配成功后会立即进行重定向操作
permanent返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url该标记和redirect类似,他是永久重定向

rewrite匹配优先级

  1. 先执行server标签中的rewrite指令。
  2. 再执行location标签的匹配。
  3. 最后执行location标签中的rewrite指令。

场景变量

举例:https://blog.csdn.net/weixin_40901913/article/details/135625896

  1. $host:表示匹配域名,如:blog.csdn.net。
  2. $server_port:表示匹配端口,默认http端口80,默认https端口443。
  3. $request_uri:表示匹配完整的请求URL,如:https://blog.csdn.net/weixin_40901913/article/details/135625896。
  4. $document_uri:表示匹配完整的请求路径,如:/weixin_40901913/article/details/135625896。
  5. $document_root:表示匹配真实的站点目录,如:/www/wangmingqu/html/。
  6. $request_filename:表示匹配真实站点目录下的文件,如:/www/wangmingqu/html/test.png

location基本语法

location分类

符号举例解释
=location = test {}精确匹配
location test {}一般匹配
~location ~ test {}正则匹配

location正则表达式

标记说明
~执行一个正则匹配,区分大小写
~*执行一个正则匹配,不区分大小写
!~执行一个正则匹配,区分大小写不匹配
!~*执行一个正则匹配,不区分大小写不匹配
^~普通字符匹配,使用前缀匹配,如果匹配成功,则不再匹配其他的location
=普通字符精确匹配,也就是完全匹配
@定义一个命令的location,使用在内部定向时

location优先级

  1. 首先是精确匹配。
  2. 其次是前缀匹配。
  3. 再次是按文件中顺序的正则匹配。
  4. 然后是匹配不带任何修饰的前缀匹配。
  5. 最后是通用匹配。
  6. 总结:
(1)优先级总结:(location=完整路径)>(location ^~ 路径)>(location~,~*正则顺序)>(location不分起始路径)>(location /)(2)location匹配:
首先看优先级:精确(=)>前缀(^~)>正则(~,~*)>一般>通用(/)
优先级相同:正则看上下顺序,上面的优先,一般匹配看长度,最长匹配的优先精确,前缀,正则,一般都没有匹配到,最后再看通用匹配,一般匹配

应用

准备环境

安装Nginx

默认已安装了Nginx,此处使用yam安装(与源码安装同理)。

配置Nginx

  1. 主配置文件修改,路径:/etc/nginx/nginx.conf
user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;keepalive_timeout  65;#开启重写日志rewrite_log     on;include /etc/nginx/conf.d/*.conf;
}
  1. 子配置文件修改,路径:/etc/nginx/conf.d/wangmingqu.conf
server {listen 80;server_name wang.mingqu.com;charset utf8;location / {root /www/wangmingqu/html;index index.html index.htm;}location /weihu {root /www/wangmingqu;index index.html index.htm;}
}

资源准备

  1. 测试页面准备
mkdir -p /www/wangmingqu/{html,weihu,student/video}
echo "重写测试页面 192.168.108.129" > /www/wangmingqu/html/index.html
echo "重写测试页面 维护页面" > /www/wangmingqu/weihu/index.html
echo "访问文件路径为:/www/wangmingqu/student/video/" > /www/wangmingqu/student/video/index.html
  1. 测试页面预览

image.png
image.png

案例一

目标

基于域名的跳转。
访问域名:wang.mingqu.com/baidu时,跳转至域名:www.baidu.com。

操作

  1. 编辑Nginx配置文件
server {listen 80;server_name wang.mingqu.com;charset utf8;location / {root /www/wangmingqu/html;index index.html index.htm;}location /baidu {rewrite ^/baidu https://www.baidu.com;}
}
  1. 检查配置
nginx -t
systemctl reload nginx

验证

  1. 访问验证

image.png

  1. 日志查看
tail -300f /var/log/nginx/error.log2024/02/01 10:53:21 [notice] 27663#27663: *84 "/baidu" matches "/baidu", client: 192.168.108.1, server: wang.mingqu.com, request: "GET /baidu HTTP/1.1", host: "wang.mingqu.com"
2024/02/01 10:53:21 [notice] 27663#27663: *84 rewritten redirect: "https://www.baidu.com", client: 192.168.108.1, server: wang.mingqu.com, request: "GET /baidu HTTP/1.1", host: "wang.mingqu.com"

案例二

目标

基于客户端IP访问跳转。
所有IP访问网站均为一个固定页面,仅客户端(192.168.108.1)可以正常访问。

操作

  1. 编辑Nginx配置文件
server {listen 80;server_name wang.mingqu.com;charset utf8;#设置一个变量,名称为rewrite_IP,变量值为true。set $rewrite true;#判断是否为合法IPif ($remote_addr = "192.168.108.1"){#如果地址不是192.168.108.1,则将rewrite_IP变量值设为false。set $rewrite false;}#除了合法IP,其他IP都进行重写跳转维护页面if ($rewrite = true){rewrite (.+) /weihu.html;}location = /weihu.html {root /www/wangmingqu/weihu/;index index.html index.htm;}location / {root /www/wangmingqu/html;index index.html index.htm;}}
  1. 检查配置
nginx -t
systemctl reload nginx

验证

  1. 访问验证

192.168.108.1主机访问
image.png
192.168.108.130主机访问
image.png

  1. 查看日志

image.png

案例三

目标

基于旧域名跳转到新域名,后面加路径
现在访问http://www.wangmingqu.com/video,将直接跳转到http://wang.mingqu.com/student/video

操作

  1. 编辑Nginx配置文件
server {listen 80;server_name www.wangmingqu.com;charset utf-8;location /video {#这里的$1为位置变量,代表/videorewrite (.+) http://wang.mingqu.com/student/$1 permanent;}location / {root /www/wangmingqu/student/video;index index.html index.htm;}
}
  1. 检查配置
nginx -t
systemctl reload nginx

验证

  1. 访问验证

image.png

  1. 查看日志

image.png

案例四

目标

基于参数匹配的跳转
现在访问http://wang.mingqu.com/10010.html,跳转到http://wang.mingqu.com页面。

操作

  1. 编辑Nginx配置文件
server {listen 80;server_name wang.mingqu.com;charset utf-8;if ($request_uri ~ ^/10010.html$) {rewrite (.+) http://wang.mingqu.com permanent;}location / {root /www/wangmingqu/html;index index.html index.htm;}
}
  1. 检查配置
nginx -t
systemctl reload nginx

验证

  1. 访问验证

image.png

  1. 查看日志

image.png

案例五

目标

基于目录下所有php结尾的文件跳转
当访问http://wang.mingqu.com/data/121.php跳转到http://wang.mingqu.com。

操作

  1. 编辑Nginx配置文件
server {listen 80;server_name wang.mingqu.com;charset utf-8;location ~* /data/.*\.php$ {rewrite (.+) http://wang.mingqu.com permanent;}location / {root /www/wangmingqu/html;index index.html index.htm;}
}
  1. 检查配置
nginx -t
systemctl reload nginx

验证

  1. 访问验证

image.png

  1. 查看日志

image.png

案例六

目标

基于普通的url请求跳转
当访问http://wang.mingqu.com/data/121.html跳转到http://wang.mingqu.com

操作

  1. 编辑Nginx配置文件
server {listen 80;server_name wang.mingqu.comcharset utf-8;location ~* ^/data/121.html {rewrite (.+) http://wang.mingqu.com permanent;}if ($request_uri ~* ^/abc/abc.html$) {rewrite (.+) http://wang.mingqu.com permanent;}location / {root /www/wangmingqu/html;index index.html index.htm;}
}
  1. 检查配置
nginx -t
systemctl reload nginx

验证

  1. 访问验证

image.png

  1. 查看日志

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/512415.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抢先看!Salesforce新职业Admineloper适合你吗?

每个Salesforce管理员在思考自己的职业生涯时,可能都会想到:下一步是往架构师,或者开发,还是咨询的方向发展。无论哪种职业规划,都需要培养新的技能。 由于角色职责、团队、客户需求等的变化,许多管理员在…

OSPF故障排查,这10大技巧是个网工都在用!

中午好,我的网工朋友。 OSPF这个名词网工们都不陌生吧。 OSPF,即开放式最短路径优先(Open Shortest Path First,OSPF)是广泛使用的一种动态路由协议。 它属于链路状态路由协议,具有路由变化收敛速度快、…

光纤激光焊接机:现代焊接工艺的变革引领者

随着科技的不断进步,传统焊接工艺正经历着一场革命性的变革。在这场变革中,光纤激光焊接机凭借其独特的技术优势,正逐渐崭露头角,成为现代焊接工艺的革新者。 光纤激光焊接机是一种采用激光束作为热源,通过聚焦镜将激光…

现代信号处理学习笔记(三)信号检测

通过观测数据判断信号是否存在,这一问题称为信号检测。 目录 前言 一、统计假设检验 1、信号检测的基本概念 2、信号检测理论测度 比率测度 概率测度 3、决策理论空间 二、概率密度函数与误差函数 1、概率密度函数 2、误差函数与补余误差函数 三、检测概…

容器云平台巡检实战:运维进阶技巧与策略

1 docker容器日常巡检 通过以下方式进行检查: 1.1 docker/podman ps查看容器状态 Docker/podman ps -a 查看容器状态STATUS: Exited(0):表示容器正常退出 Exited(其他数字):容器异常退出,需要通过log 查看原因 Up…

7款炫酷的前端动画特效分享(三)(附效果图及在线演示)

分享7款好玩的前端动画特效 其中有CSS动画、SVG动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 CSS3模仿四季交替动画 基于HTML5CSS3实现的卡通风格一年四季交替动画特效 以下效果图只能体现框架的…

redis09 集群(cluster)

思维草图 为什么要使用集群 单台redis内存容量的限制单台redis并发写量太大有性能瓶颈 redis集群认识 redis集群是对redis的水平扩容,即启动N个redis节点,将整个数据分布存储在这个N个节点中,每个节点存储总数据的1/N。 如下图&#xff1…

Chain-of-thought prompting(链式思考提示)

1.大模型“涌现”的思维链 最近 AI 大厂的开发人员和高校的 NLP 研究人员,都在琢磨,怎么让大模型“涌现”。 所谓“涌现”,在大模型领域指的是当模型突破某个规模时,性能显著提升,表现出让人惊艳、意想不到的能力。比如…

vue点击按钮同时下载多个文件

点击下载按钮根据需要的id调接口拿到返回需要下载的文件 再看返回的数据结构 数组中一个对象,就是一个文件,多个对象就是多个文件 下载函数 // 下载tableDownload(row) {getuploadInventoryDownload({ sysBatch: row.sysBatch, fileName: row.fileName…

针对conan install下载source失败问题解决

ps:下面操作是Linux系统,针对win操作系统也适合 问题现象 在运行conan install时,本地没有对应的库的缓存,conan会自动从conan center下载,可能会出现以下情况,重试多次,仍然是报错。 libssh2/1.11.0: C…

[项目设计] 从零实现的高并发内存池(三)

🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[高并发内存池] ❤️ 前置学习专栏:[Linux学习] ⏰ 我们仍在旅途 ​ 目录 4.CentralCache实现 4.1 CentralCache整体架构 4.2 围绕Span的相关设计…

有名信号量、网络协议模型、UDP编程发送端

我要成为嵌入式高手之3月5日Linux高编第十五天&#xff01;&#xff01; ______________________________________________________ 学习笔记 有名信号量 1、创建semget #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(…