百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

nginx的valid_referers指令(nginx xforwardfor)

ztj100 2025-03-26 19:20 14 浏览 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的注意事项

  1. Referer 可伪造
    Referer 值可通过客户端修改,不能作为唯一安全措施,需结合其他验证(如 Token 或 IP 白名单)。
  2. 正则表达式性能
    避免复杂正则,尤其是高频访问的路径,可能影响性能。
  3. 缓存影响
    配置变更后需重新加载 Nginx:
  4. bash
  5. 复制
  6. nginx -s reload
  7. 测试方法
    使用 curl 模拟不同 Referer:
  8. bash
  9. 复制
  10. 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)持续优化规则。

相关推荐

使用 Pinia ORM 管理 Vue 中的状态

转载说明:原创不易,未经授权,谢绝任何形式的转载状态管理是构建任何Web应用程序的重要组成部分。虽然Vue提供了管理简单状态的技术,但随着应用程序复杂性的增加,处理状态可能变得更具挑战性。这就是为什么...

Vue3开发企业级音乐Web App 明星讲师带你学习大厂高质量代码

Vue3开发企业级音乐WebApp明星讲师带你学习大厂高质量代码下栽课》jzit.top/392/...

一篇文章说清 webpack、vite、vue-cli、create-vue 的区别

webpack、vite、vue-cli、create-vue这些都是什么?看着有点晕,不要怕,我们一起来分辨一下。...

超赞 vue2/3 可视化打印设计VuePluginPrint

今天来给大家推荐一款非常不错的Vue可拖拽打印设计器Hiprint。引入使用//main.js中引入安装import{hiPrintPlugin}from'vue-plugin-...

搭建Trae+Vue3的AI开发环境(vue3 ts开发)

从2024年2025年,不断的有各种AI工具会在自媒体中火起来,号称各种效率王炸,而在AI是否会替代打工人的话题中,程序员又首当其冲。...

如何在现有的Vue项目中嵌入 Blazor项目?

...

Vue中mixin怎么理解?(vue的mixins有什么用)

作者:qdmryt转发链接:https://mp.weixin.qq.com/s/JHF3oIGSTnRegpvE6GSZhg前言...

Vue脚手架安装,初始化项目,打包并用Tomcat和Nginx部署

1.创建Vue脚手架#1.在本地文件目录创建my-first-vue文件夹,安装vue-cli脚手架:npminstall-gvue-cli安装过程如下图所示:创建my-first-vue...

新手如何搭建个人网站(小白如何搭建个人网站)

ElementUl是饿了么前端团队推出的桌面端UI框架,具有是简洁、直观、强悍和低学习成本等优势,非常适合初学者使用。因此,本次项目使用ElementUI框架来完成个人博客的主体开发,欢迎大家讨论...

零基础入门vue开发(vue快速入门与实战开发)

上面一节我们已经成功的安装了nodejs,并且配置了npm的全局环境变量,那么这一节我们就来正式的安装vue-cli,然后在webstorm开发者工具里运行我们的vue项目。这一节有两种创建vue项目...

.net core集成vue(.net core集成vue3)

react、angular、vue你更熟悉哪个?下边这个是vue的。要求需要你的计算机安装有o.netcore2.0以上版本onode、webpack、vue-cli、vue(npm...

使用 Vue 脚手架,为什么要学 webpack?(一)

先问大家一个很简单的问题:vueinitwebpackprjectName与vuecreateprojectName有什么区别呢?它们是Vue-cli2和Vue-cli3创建...

vue 构建和部署(vue项目部署服务器)

普通的搭建方式(安装指令)安装Node.js检查node是否已安装,终端输入node-v会使用命令行(安装)npminstallvue-cli-首先安装vue-clivueinitwe...

Vue.js 环境配置(vue的环境搭建)

说明:node.js和vue.js的关系:Node.js是一个基于ChromeV8引擎的JavaScript运行时环境;类比:Java的jvm(虚拟机)...

vue项目完整搭建步骤(vuecli项目搭建)

简介为了让一些不太清楚搭建前端项目的小白,更快上手。今天我将一步一步带领你们进行前端项目的搭建。前端开发中需要用到框架,那vue作为三大框架主流之一,在工作中很常用。所以就以vue为例。...

取消回复欢迎 发表评论: