Nginx rewrite+防盗链

Nginx

  • Nginx
    • 6、重写功能rewrite
      • 6.1 if指令
      • 6.2 return
      • 6.3 set指令
      • 6.4 break指令
      • 6.5 rewrite指令
        • 6.5.1 基本原理
        • 6.5.2 语法格式
        • 6.5.3 举例
          • 6.5.3.1 测试访问bj跳转到beijing
          • 6.5.3.2 域名重定向:所有域名都跳转到accp
    • 7、防盗链
      • 7.1 什么是防盗链
      • 7.2 防盗链简介
      • 7.3 实现防盗链

6、重写功能rewrite

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之

一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性

192.168.210.101 rewrite www.baidu.com

重写域名,访问此ip转到baidu

ngx_http_rewrite_module模块指令官方文档: https://nginx.org/en/docs/http/ngx_http_rewrite_module.html

6.1 if指令

官方文档:

https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断

基本语法if (条件匹配) { action
}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:

选项功能
=比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~*不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~*不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
vim /apps/nginx/conf.d/pc.conf
server{listen 80;server_name www.pc.com;root /data/html/pc;location  /main {default_type text/html;if ( $scheme = http ) {echo "wo ai ni";}
}
}

在这里插入图片描述

在另一台机器访问192.168.210.101/main

在这里插入图片描述

6.2 return

return用于完成对请求的处理,并直接向客户端返回响应状态码,return可以在server、if 和 location块进行配置

return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code url; #返回给客户端的URL地址,跳转链接只能使用301和302
vim /apps/nginx/conf.d/pc.conf
server{listen 80;server_name www.pc.com;root /data/html/pc;location  /main {default_type text/html;if ( $scheme = http ) {return 500 "this service is not support";#定义状态码为500}}
}
nginx -s reload;

在这里插入图片描述

在另一台机器访问192.168.210.101/main -I
curl 192.168.210.101/main -I

在这里插入图片描述

vim /apps/nginx/conf.d/pc.conf
server{listen 80;server_name www.pc.com;root /data/html/pc;location  / {default_type text/html;if ( !-e $request_filename ) {return 302 /index.html;#如果访问文件不存在则跳转到主页面}}
}
nginx -s reload;

在这里插入图片描述

在浏览器访问192.168.210.101/index.html

在这里插入图片描述

6.3 set指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。

基本语法
set $variable value;
#$variable 是要创建或更改的变量的名称,value是要给变量赋予的值创建一个变量并赋予一个静态值:
set $my_var 'Hello, World!';将已有的变量的值赋给新的变量
set $new_var $existing_var;使用表达式给变量赋值
set $num 10;
set $result $num * 2;
举例
#配置文件中修改
location /main {root /data/html/pc;index index.html;default_type text/html;set $name byyd;echo $name;set $my_port $server_port;echo $my_port;
}
curl 192.168.210.101/main #看看是否返回自定义变量的值

在这里插入图片描述

6.4 break指令

用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用

注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行

vim /apps/nginx/conf.d/pc.conf
server{listen 80;server_name www.pc.com;root /data/html/pc;location  /main {default_type text/html;set $name "kkk";echo $name;break;set $class daer;echo $class;echo "nihao";}
}
nginx -s reload;用另一台服务器访问192.168.210.101/main
curl http://192.168.210.101/main

在这里插入图片描述

在这里插入图片描述

6.5 rewrite指令

6.5.1 基本原理

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

官方文档:

https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

rewrite可以配置在 server、location、if

6.5.2 语法格式
rewrite regex               replacement        [flag];正则匹配原始访问url    替代你想让客户访问的      标志
#rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI

注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301

正则表达式格式

. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字     
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W  #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^kgc] #匹配除了kgc 这几个字母以外的任意字符
flag标志

ewrtie有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型

  • 跳转型指由客户端浏览器重新对新地址进行请求
  • 代理型是在WEB服务器内部实现跳转
redirect;302
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302permanent;301       www.bj.com     www.beijing.com
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301break;       www.bj.com
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
#适用于一个URL一次重写 last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户301
6.5.3 举例
6.5.3.1 测试访问bj跳转到beijing
cd /data/html/pc
mkdir bj
mkdir beijing
echo bj > bj/index.html
echo beijing > beijing/index.html

在这里插入图片描述

curl 192.168.210.101/bj -L
curl 192.168.210.101/beijing -L

在这里插入图片描述

vim /apps/nginx/conf.d/pc.conf
server{listen 80;server_name www.pc.com;root /data/html/pc;location  /bj {rewrite ^/bj/(.*)   /beijing/$1 permanent;#以bj开头跳转到beijing,permanent永久重定向#此处的$1代表后项引用}}nginx -s reload

在这里插入图片描述

curl 192.168.210.101/bj -L
curl 192.168.210.101/beijing -L

在这里插入图片描述

6.5.3.2 域名重定向:所有域名都跳转到accp
vim /apps/nginx/conf.d/pc.conf
server{listen 80;server_name www.pc.com;root /data/html/pc;location  / {rewrite  /   http://www.accp.com permanent;#访问www.pc.com就相当于访问www.accp.com}}
#做域名解析
vim /etc/hosts
192.168.210.101 www.pc.com
在内置浏览器访问www.pc.com

7、防盗链

7.1 什么是防盗链

盗链(Hotlinking)是指在一个网站上使用或显示其他网站的资源(如图片、视频、音频等)的行为,而不是通过将资源保存到本地服务器来引用这些资源。

盗链者直接链接到原始资源的URL,使得资源消耗原始网站的带宽和服务器资源,会给原始网站带来额外的负担,并且可能导致资源被滥用或不当使用。

7.2 防盗链简介

Nginx的防盗链机制实现,跟一个头部字段:Referer有关,该字段主要描述了当前请求是从哪儿发出的,那么在Nginx中就可获取该值,然后判断是否为本站的资源引用请求,如果不是则不允许访问。

基本语法
valid_referers none | blocked | server_names | string ...;

none:表示接受没有Referer字段的HTTP请求访问。

blocked:表示允许http://https//以外的请求访问。

server_names:资源的白名单,这里可以指定允许访问的域名。

string:可自定义字符串,支配通配符、正则表达式写法。

7.3 实现防盗链

第一台主机
vim /apps/nginx/conf.d/pc.conf
#添加内容
location ~* \.(jpg|gif|swf)$ {            root  /data/html/pc;valid_referers none blocked *.pc.com pc.com;   if ( $invalid_referer ) {rewrite ^/ http://www.pc.com/error.png;#return  403}}

在这里插入图片描述

cd  /data/html/pc/
在此目录在放入 a.jpg 和 error.png 
#用于测试的图片
第二台主机
#关闭防火墙和selinux
systemctl stop firewalld
setenforce  0
#yum安装nginx
yum install epel-release.noarch -y
yum install nginx -y
cd /usr/share/nginx/htmlvim  index.html<html>
<body>
<h1> this is pc </h1>
<img src="http://www.pc.com/a.jpg"/>
</body>
</html>#保存后启动服务
systemctl start nginx 

在这里插入图片描述

#修改主配置文件
vim  /etc/nginx/nginx.conf #41行修改
server_name  www.accp.com;

在这里插入图片描述

修改windows的本地hosts文件,添加映射关系

在这里插入图片描述

开始测试 防盗链是否配置成功
没有配置防盗链时
浏览器访问
www.accp.com

在这里插入图片描述

配置防盗链后
浏览器访问
www.accp.com

在这里插入图片描述

补充说明
如果子配置文件中用的 return 403

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

《研发效能(DevOps)工程师国家职业技术认证》工信部教考中心认证证书:塑造研发效能的黄金标准丨IDCF

随着科技的飞速发展和市场竞争的日益激烈&#xff0c;高素质的技术管理人才在当今社会中扮演着越来越重要的角色。特别是在信息技术领域&#xff0c;企业对于拥有专业技能和丰富知识的研发效能管理与技术人才的需求愈发旺盛。工业和信息化部教育与考试中心&#xff08;以下简称…

MissionPlanner编译过程

环境 windows 10 mission planner 1.3.80 visual studio 2022 git 2.22.0 下载源码 (已配置git和ssh) 从github上克隆源码 git clone gitgithub.com:ArduPilot/MissionPlanner.git进入根目录 cd MissionPlanner在根目录下的ExtLibs文件下是链接的其它github源码&#xff0…

【深度学习】 Python 和 NumPy 系列教程(十二):NumPy详解:4、数组广播;5、排序操作

目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象&#xff08;ndarray&#xff09; 多维数组的属性 1、创建数组 2、数组操作 3、数组数学 4、数组广播 5、排序操作 1. np.sort() 函数 2. np.argsort() 函数 3. ndarray.sort() 方法 4. 按列或行排序 5. n…

Mybatis 映射器中使用@InsertProvider,@UpdateProvider,@DeleteProvider,@SelectProvider

上一篇我们介绍了在Mybatis映射器的映射方法中使用Param接收多个参数&#xff1b;本篇我们继续介绍如何在Mybatis的映射器中使用动态SQL。 如果您对Mybatis映射器的映射方法中使用Param接收多个参数不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&…

【Java 基础篇】Java 多线程详解

多线程是 Java 编程中的一个重要概念&#xff0c;它允许程序同时执行多个任务&#xff0c;提高了程序的性能和响应能力。本篇博客将深入探讨 Java 多线程&#xff0c;从基础概念到实际应用&#xff0c;适用于 Java 初学者和希望深入了解多线程的开发人员。 什么是多线程&#…

Vue之路由及Node.js环境搭建(一起探索新事物)

目录 ​编辑 前言 一、Vue之路由 1.路由简介 1.1 什么是路由 1.2 什么是SPA 1.3 SPA的实现思路 1.4 使用路由的优势 2. 案例演示 2.1 导入所需的js文件 2.2 编写案例代码&#xff08;模拟页面跳转&#xff09; 二、Vue之node.js 1. node.js简介 1.1 什么是node.j…

ubuntu 18.04 中 eBPF samples/bpf 编译

1. history 信息 一次成功编译 bpf 后执行 history 得到的信息&#xff1a; yingzhiyingzhi-Host:~/ex/ex_kernel/linux-5.4$ history1 ls2 mkdir ex3 cd ex4 mkdir ex_kernel5 ls /boot/6 sudo apt install linux-source7 ls /usr/src/8 uname -r9 cd ex_kernel/10…

postman记录backup

之前一直未登录postman&#xff0c;在临时空间处理请求&#xff0c;可能是因为postman更新了&#xff0c;导致其记录没了 别着急&#xff01; 首先我们先登录postman&#xff0c;有谷歌登录方式等 第一步、登录后点击import 第二步、点击files 第三步、找到c:/users/AppData…

20-SpringCloudAlibaba-2

六 分布式流量防护 1 认识分布式流量防护 在分布式系统中&#xff0c;服务之间的相互调用会生成分布式流量。如何通过组件进行流量防护&#xff0c;并有效控制流量&#xff0c;是分布式系统的技术挑战之一。 什么是服务雪崩 假设我有一个微服务系统&#xff0c;这个系统内包…

【WinForm】WinForm窗体程序如何一直运行在屏幕的最前方

文章目录 前言一、新建一个项目二、完整代码三、收起程序总结 前言 程序一致运行在其他软件的最前方&#xff0c;比如让WinForm窗体程序一致运行在微信的最前面。 WinForm窗体程序如何一直运行在屏幕的最前方 一、新建一个项目 新建一个WinForm程序 设置最大化为true&…

R语言RSTAN MCMC:NUTS采样算法用LASSO 构建贝叶斯线性回归模型分析职业声望数据...

全文链接&#xff1a;http://tecdat.cn/?p24456 如果你正在进行统计分析&#xff1a;想要加一些先验信息&#xff0c;最终你想要的是预测。所以你决定使用贝叶斯&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 但是&#xff0c;你没有共轭先验。你…

数据结构与算法:排序算法(1)

目录 冒泡排序 思想 代码实现 优化 鸡尾酒排序 优缺点 适用场景 快速排序 介绍 流程 基准元素选择 元素交换 1.双边循环法 使用流程 代码实现 2.单边循环法 使用流程 代码实现 3.非递归实现 排序在生活中无处不在&#xff0c;看似简单&#xff0c;背后却隐藏…

【漏洞复现】JumpServer未授权访问漏洞(CVE-2023-42442)

文章目录 前言声明一、JumpServer简介二、漏洞描述三、影响范围四、资产搜索五、漏洞复现六、修复建议 前言 JumpServer的权限管理存在缺陷&#xff0c;未经授权的远程攻击者可以下载历史会话连接期间的所有操作日志&#xff0c;可导致敏感信息泄漏。 声明 请勿利用文章内的…

Mybatis懒加载

懒加载是什么&#xff1f; 按需加载所需内容&#xff0c;当调用到关联的数据时才与数据库交互否则不交互&#xff0c;能大大提高数据库性能&#xff0c;并不是所有场景下使用懒加载都能提高效率。 Mybatis懒加载&#xff1a;resultMap里面的association、collection有延迟加载功…

视频文本检索(ICCV 23):Unified Coarse-to-Fine Alignment for Video-Text Retrieval

论文作者&#xff1a;Ziyang Wang,Yi-Lin Sung,Feng Cheng,Gedas Bertasius,Mohit Bansal 作者单位&#xff1a;UNC Chapel Hill 论文链接&#xff1a;http://arxiv.org/abs/2309.10091v1 项目链接&#xff1a;https://github.com/Ziyang412/UCoFiA 内容简介&#xff1a; …

Win10专业版开启远程桌面

Win10专业版开启远程桌面 方法一&#xff1a; 一、按“Win R”键&#xff0c;然后输入“sysdm.cpl”并按下回车键打开系统属性。 二、选择“远程”选项卡&#xff0c;在远程桌面中勾选“允许远程连接到此计算机”就可以开启远程桌面&#xff1b; 方法二&#xff1a; 一、打…

评价指标分类

声明 本文是学习GB-T 42874-2023 城市公共设施服务 城市家具 系统建设实施评价规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了城市家具系统建设实施的评价原则、评价流程&#xff0c;给出了评价指标&#xff0c;描述了 方…

visual studio 安装包丢失或损坏

visual studio 安装包丢失或损坏 如下图所示为vs2015报错信息。 解决方案&#xff1a; 找到镜像文件或者压缩包的解压位置&#xff1b; 路径&#xff1a;C:\Users\Administrator\Desktop\packages 复制该路径至上图的请提供搜索包的位置。

如何自动获取短信验证码?

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 这篇文章通过解决实际项目开发中遇到的如何自动获取短信验证码的问题&#xff0c;进一步讲述在Java中如何使用正则。 Java中如何使用正则 Java中正则相关类位于java.util.r…

新款 锐科达 SV-2102VP SIP广播音频模块 RTP流音频广播

新款 锐科达 SV-2102VP SIP广播音频模块 RTP流音频广播 SV-2102VP和 SV-2103VP网络音频模块是一款通用的独立SIP音频功能模块&#xff0c;可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 本系列模块可以应用于以下领域&#xff1a; • 各种商…