当前位置: 首页 > news >正文

nginx优化和重写功能rewrite

一、nginx优化

1.防盗链

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名,正常的referer信息有以下几种:

none:#请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked:#请求报文有referer首部,但无有效值,比如为空。
server_names:#referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string:#自定义指定字符串,但可使用*作通配符。示例: *.kgc.org www.kgc.*
regular expression:#被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:~.*\.kgc\.com

实现防盗链

location ~* \.(jpg|gif|swf)$ {            root  /data/nginx/pc;valid_referers none blocked *.pc.com pc.com;   if ( $invalid_referer ) {rewrite ^/ http://www.pc.com/error.png;#return  403}}~* \.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件
Valid_referers:设置信任的网站,可以正常使用图片。
None :浏览器中 referer 为空的情况,就是直接在浏览器访问图片。
Blocked :referer 不为空的情况 ,但是值被代理或防火墙删除了,这些值不以 http://或https://开头。后面的网址或者域名:referer 中包含相关字符串的网址。
If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer 为1,则执行后面的操作,即进行重写或返回 403 页面。

2.隐藏版本号

#修改配置文件  放在   http语句中
http {server_tokens  off;nginx -s reload
#重新加载#验证
curl -I http://192.168.91.100/HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Thu, 21 Apr 2022 03:34:51 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Apr 2022 02:43:17 GMT
Connection: keep-alive
ETag: "625e21c5-264"
Accept-Ranges: bytescurl -I http://192.168.91.100/HTTP/1.1 200 OK
Server: nginx
Date: Thu, 21 Apr 2022 04:04:23 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Apr 2022 02:43:17 GMT
Connection: keep-alive
ETag: "625e21c5-264"
Accept-Ranges: bytes

二、重写功能rewrite指令

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

格式:
【rewrite】
rewrite regex replacement [flag];
指令 正则 替换 标志

rewrite可以配置在 server、location、if
语法格式 :
rewrite regex               replacement(www.baidu.com)        [flag];正则匹配原始访问url    替代你想让客户访问的                   标志  premanent(301)   redirect(302) break  last

利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型
flag说明

redirect;302
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302permanent;301       
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301break;       
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
#适用于一个URL一次重写 last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户301

例子:

访问 bj 跳转到 beijing

location /bj {root /data/nginx/pc;   rewrite ^/bj/(.*)    /beijing/$1   permanent;
}
#此处的$1代表后项引用

三、return指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置

语法格式:

www.kgc.com/test/
404
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code url; #返回给客户端的URL地址

例子:

location / {root /data/nginx/html/pc;default_type text/html;index index.html;if ( $scheme = http ){#return 666;#return 666 "not allow http";#return 301 http://www.baidu.com;return 500 "service error";}}
#浏览网页可以看到“service error”

相关文章:

  • vscode怎么拷贝插件到另一台电脑
  • 如何用结构化写好GPT的Prompt提示词
  • MySQL之创建高性能的索引(十一)
  • QT之动态加载树节点(QTreeWidget)
  • 《数字图像处理-OpenCV/Python》第15章:图像分割
  • IDEA 2023.3.6 下载、安装、激活与使用
  • 碳微球是新型碳材料 在高科技领域应用价值极高
  • Re0:从零开始的C++游戏开发【中】
  • 计网期末复习指南(六):应用层(DNS、FTP、URL、HTTP、SMTP、POP3)
  • Java学习19-List、set容器
  • 【云原生 | 60】Docker中通过docker-compose部署kafka集群
  • python-web应用程序-Django-From组件
  • jeecg dictText字典值
  • C++:栈(stack)、队列(queue)、优先级队列(priority_queue)
  • 【计算机毕设】基于SpringBoot的民宿在线预定平台设计与实现 - 源码免费(私信领取)
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2017届校招提前批面试回顾
  • Angular 2 DI - IoC DI - 1
  • Babel配置的不完全指南
  • Django 博客开发教程 8 - 博客文章详情页
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Spring Boot快速入门(一):Hello Spring Boot
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue 重置组件到初始状态
  • 关于List、List?、ListObject的区别
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 普通函数和构造函数的区别
  • 入门到放弃node系列之Hello Word篇
  • 一个项目push到多个远程Git仓库
  • 终端用户监控:真实用户监控还是模拟监控?
  • HanLP分词命名实体提取详解
  • Java总结 - String - 这篇请使劲喷我
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (1)虚拟机的安装与使用,linux系统安装
  • (二)linux使用docker容器运行mysql
  • (一)WLAN定义和基本架构转
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)scrum常见工具列表
  • (转)创业家杂志:UCWEB天使第一步
  • .Net 6.0 处理跨域的方式
  • .NET CLR基本术语
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET成年了,然后呢?
  • .NET关于 跳过SSL中遇到的问题
  • ?
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • []指针
  • [ActionScript][AS3]小小笔记
  • [AIGC] Java 和 Kotlin 的区别