nginx的valid_referers指令(nginx xforwardfor)
ztj100 2025-03-26 19:20 79 浏览 0 评论
valid_referers 是 Nginx 中用于验证 HTTP 请求头中 Referer 字段的指令,常用于防盗链、限制非法请求来源或实现访问控制。它通过匹配 Referer 值来判断请求是否合法,并配合 if 条件语句实现逻辑处理(如返回 403 或重定向)。
一、valid_referers语法
nginx
复制
valid_referers none | blocked | server_names | string ...;
- 参数说明:
- none:允许缺失 Referer 的请求(即请求头中没有 Referer 字段)。
- blocked:允许 Referer 被防火墙或代理修改后的请求(如被删除或替换的 Referer)。
- server_names:允许 Referer 匹配当前 server 块中 server_name 的域名。
- 字符串或正则表达式:自定义允许的 Referer 值(支持通配符 * 和正则表达式)。
二、配置示例及说明
示例 1:防止图片盗链
nginx
复制
server {
listen 80;
server_name example.com;
location ~ \.(jpg|png|gif)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
# 或返回默认图片:rewrite ^ /static/deny.jpg;
}
}
}
- 作用:
仅允许来自 example.com、其子域名(*.example.com)或无 Referer 的请求访问图片资源,其他来源返回 403。 - 关键点:
- none 允许直接访问(如浏览器地址栏输入图片URL)。
- blocked 允许 Referer 被过滤的请求(如某些隐私模式浏览器)。
- 变量 $invalid_referer 的值来源于 valid_referers 指令对 $http_referer 的匹配结果:当请求头中的 Referer 值符合 valid_referers 指定的有效来源时,$invalid_referer 为 0;否则为 1
示例 2:仅允许特定外部站点引用
nginx
复制
location /download/ {
valid_referers server_names ~.google. ~.bing. ~.yahoo.;
if ($invalid_referer) {
return 444; # 静默关闭连接
}
}
- 作用:
仅允许来自 google.、bing.、yahoo. 域名(如 www.google.com)的请求访问 /download/ 资源。 - 正则说明:
~.google. 表示 Referer 包含 google 的任意子域名(如 https://drive.google.com)。
示例 3:允许空 Referer 和白名单域名
nginx
复制
location /api/ {
valid_referers none api-partner.com partner-api.example.net;
if ($invalid_referer) {
return 403 "Forbidden: Invalid referer";
}
}
- 作用:
允许无 Referer 或来自 api-partner.com、partner-api.example.net 的请求访问 API,其他返回 403。 - 应用场景:
保护 API 接口,仅允许合作伙伴或内部服务调用。
示例 4:黑名单模式(拒绝特定 Referer)
nginx
复制
location / {
valid_referers blocked ~.spam-site. ~.malicious.;
if ($invalid_referer = "") {
# 合法请求(不在黑名单中)
proxy_pass http://backend;
}
if ($invalid_referer) {
return 444;
}
}
- 作用:
拒绝 Referer 包含 spam-site 或 malicious 的请求,其他请求正常代理到后端。 - 逻辑说明:
$invalid_referer 在 valid_referers 匹配时为 空字符串,未匹配时为 1。
示例 5:动态文件类型防盗链
nginx
复制
map $http_referer $allow_access {
default 0;
~^https?://([^/]+\.)?example.com/ 1;
~.trusted-domain.com 1;
"" 1; # 允许空 Referer
}
server {
location ~* \.(mp4|pdf)$ {
if ($allow_access = 0) {
return 403;
}
}
}
- 作用:
使用 map 模块定义更复杂的 Referer 规则,根据 $http_referer 的值动态映射到 $allow_access,决定是否允许访问。允许 example.com 子域名、trusted-domain.com 及无 Referer 的请求访问视频和 PDF 文件。 - 优势:
map 模块逻辑更清晰,适合多条件组合。
三、valid_referers的注意事项
- Referer 可伪造:
Referer 值可通过客户端修改,不能作为唯一安全措施,需结合其他验证(如 Token 或 IP 白名单)。 - 正则表达式性能:
避免复杂正则,尤其是高频访问的路径,可能影响性能。 - 缓存影响:
配置变更后需重新加载 Nginx: - bash
- 复制
- nginx -s reload
- 测试方法:
使用 curl 模拟不同 Referer: - bash
- 复制
- curl -e "http://spam-site.com" http://example.com/image.jpg curl -H "Referer: http://trusted.com" http://example.com/image.jpg
四、总结
valid_referers 的典型应用场景包括:
- 防盗链:保护图片、视频等静态资源。
- API 保护:限制接口调用来源。
- 访问控制:结合黑名单/白名单过滤请求。
合理使用可有效减少资源滥用,但需注意其局限性,建议结合日志监控(access_log)持续优化规则。
相关推荐
- Linux集群自动化监控系统Zabbix集群搭建到实战
-
自动化监控系统...
- systemd是什么如何使用_systemd/system
-
systemd是什么如何使用简介Systemd是一个在现代Linux发行版中广泛使用的系统和服务管理器。它负责启动系统并管理系统中运行的服务和进程。使用管理服务systemd可以用来启动、停止、...
- Linux服务器日常巡检脚本分享_linux服务器监控脚本
-
Linux系统日常巡检脚本,巡检内容包含了,磁盘,...
- 7,MySQL管理员用户管理_mysql 管理员用户
-
一、首次设置密码1.初始化时设置(推荐)mysqld--initialize--user=mysql--datadir=/data/3306/data--basedir=/usr/local...
- Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门
-
1.1数据库的核心概念在开始Python数据库编程之前,我们需要先理解几个核心概念。数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它就像一个电子化的文件柜,能让我们高效...
- Linux自定义开机自启动服务脚本_linux添加开机自启动脚本
-
设置WGCloud开机自动启动服务init.d目录下新建脚本在/etc/rc.d/init.d新建启动脚本wgcloudstart.sh,内容如下...
- linux系统启动流程和服务管理,带你进去系统的世界
-
Linux启动流程Rhel6启动过程:开机自检bios-->MBR引导-->GRUB菜单-->加载内核-->init进程初始化Rhel7启动过程:开机自检BIOS-->M...
- CentOS7系统如何修改主机名_centos更改主机名称
-
请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言本文将讲解CentOS7系统如何修改主机名。...
- 前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令
-
在Linux服务器管理中,SSH(SecureShell)是远程操作的核心工具。以下是SSH终端操作的常用命令和技巧,涵盖连接、文件操作、系统管理等场景:一、SSH连接服务器1.基本连接...
- Linux开机自启服务完全指南:3步搞定系统服务管理器配置
-
为什么需要配置开机自启?想象一下:电商服务器重启后,MySQL和Nginx没自动启动,整个网站瘫痪!这就是为什么开机自启是Linux运维的必备技能。自启服务能确保核心程序在系统启动时自动运行,避免人工...
- Kubernetes 高可用(HA)集群部署指南
-
Kubernetes高可用(HA)集群部署指南本指南涵盖从概念理解、架构选择,到kubeadm高可用部署、生产优化、监控备份和运维的全流程,适用于希望搭建稳定、生产级Kubernetes集群...
- Linux项目开发,你必须了解Systemd服务!
-
1.Systemd简介...
- Linux系统systemd服务管理工具使用技巧
-
简介:在Linux系统里,systemd就像是所有进程的“源头”,它可是系统中PID值为1的进程哟。systemd其实是一堆工具的组合,它的作用可不止是启动操作系统这么简单,像后台服务...
- Linux下NetworkManager和network的和平共处
-
简介我们在使用CentoOS系统时偶尔会遇到配置都正确但network启动不了的问题,这问题经常是由NetworkManager引起的,关闭NetworkManage并取消开机启动network就能正...
你 发表评论:
欢迎- 一周热门
-
-
MySQL中这14个小玩意,让人眼前一亮!
-
旗舰机新标杆 OPPO Find X2系列正式发布 售价5499元起
-
面试官:使用int类型做加减操作,是线程安全吗
-
C++编程知识:ToString()字符串转换你用正确了吗?
-
【Spring Boot】WebSocket 的 6 种集成方式
-
PyTorch 深度学习实战(26):多目标强化学习Multi-Objective RL
-
pytorch中的 scatter_()函数使用和详解
-
与 Java 17 相比,Java 21 究竟有多快?
-
基于TensorRT_LLM的大模型推理加速与OpenAI兼容服务优化
-
这一次,彻底搞懂Java并发包中的Atomic原子类
-
- 最近发表
-
- Linux集群自动化监控系统Zabbix集群搭建到实战
- systemd是什么如何使用_systemd/system
- Linux服务器日常巡检脚本分享_linux服务器监控脚本
- 7,MySQL管理员用户管理_mysql 管理员用户
- Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门
- Linux自定义开机自启动服务脚本_linux添加开机自启动脚本
- linux系统启动流程和服务管理,带你进去系统的世界
- CentOS7系统如何修改主机名_centos更改主机名称
- 前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令
- Linux开机自启服务完全指南:3步搞定系统服务管理器配置
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)