nginx 重写功能 及防盗链

重写功能 rewrite

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

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

ngx_http_rewrite_module模块指令

if指令

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

复制代码
if (条件匹配) {   
 action
}

官方文档

bash 复制代码
https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if

实际操作 用户访问的文件不存在 直接返回主页

return

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

语法格式:

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

例子:

bash 复制代码
server { 
    listen 80;
    server_name www.kgc.com;
    root /data/nginx/pc/;
	location /{
        root /data/nginx/pc/;

}
  location /test {      #访问test 直接返回403
	return 403;         #可以改成666    
  }

}

set

  • set 指令用于设置变量值。
  • 这些变量可以在后续的请求处理过程中使用。
  • 例如,set $variable_name "value"; 将创建一个名为 $variable_name 的变量并为其赋值 "value"

break

  • if 指令块内,break 用于停止执行当前 if 块中的后续指令,并继续处理请求。
  • rewrite 指令的上下文中,break 指令并不常用,因为 rewrite 指令本身在每次重写后都会终止当前指令集的处理(除非使用了 lastbreak 标志的 rewrite 指令)。
bash 复制代码
if ($slow) {
   limit_rate 10k;
   break;
}
location /main {
   root /data/nginx/html/pc;
   index index.html;
   default_type text/html;
    set $name kgc;
    echo $name;
   break;  #location块中break后面指令还会执行
    set $my_port $server_port;
    echo $my_port;
 }

rewrite

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

rewrite可以配置在 server、location、if

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

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

bash 复制代码
#访问  bj   跳转到  beijing  
location /bj {
   root /data/nginx/pc;   
   rewrite ^/bj/(.*)    /beijing/$1   permanent;

}

防盗链

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

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

盗链

服务器1上有一张图片

服务器二 将资源路径设置为服务器1 从而达到白嫖的目的

实现防盗链

第一胎服务器

bash 复制代码
vim   /apps/nginx/conf.d/pc.conf
server{
        listen 80;/
        server_name  www.pc.com;
        root    /data/nginx/pc;
        location  / {
        root  /data/nginx/pc;
}
        location ~* \.(jpg|gif|swf|jpeg|bmp)$ {     #匹配到jpg|gif|swf|jpeg|bmp 结尾的 
         root  /data/nginx/pc;    根目录
         valid_referers none blocked *.pc.com pc.com; #定义白名单 允许谁跳转过来访问
         if ( $invalid_referer ) {      #不在名单里 返回403
           return   403;
        }
        }
}
}
cd  /data/nginx/pc/
相关推荐
高木木的博客1 小时前
数字架构智能化测试平台(1)--总纲
人工智能·python·nginx·架构
徐子元竟然被占了!!2 小时前
Nginx
运维·nginx
图图玩ai3 小时前
SSH 命令管理工具怎么选?从命令收藏到批量执行一次讲清
linux·nginx·docker·ai·程序员·ssh·可视化·gmssh·批量命令执行
CXH7284 小时前
nginx——https
运维·nginx·https
Lentou6 小时前
nginx反向代理
运维·nginx
遇见火星6 小时前
linux设置开启启动服务
linux·运维·服务器·nginx
咸鱼翻身小阿橙7 小时前
QT P4
数据库·qt·nginx
o丁二黄o9 小时前
若依部署Nginx和Tomcat
运维·nginx·tomcat
一个public的class10 小时前
前后端 + Nginx + Gateway + K8s 全链路架构图解
前端·后端·nginx·kubernetes·gateway
bukeyiwanshui10 小时前
20260420 Nginx 服务器
运维·服务器·nginx