讲师中心 微信公众号
AI工具推荐 视频效率加速

PHP实现图片防盗链_Referer判断与伪静态重定向【详解】

夏明吖_5963

夏明吖_5963

发布时间:2026-05-07 11:21:46

|

545人浏览过

|

来源于php中文网

原创

Referer防盗链需严格校验白名单域名,解析URL提取host后精确匹配;空或无效Referer应拒绝;响应前禁止输出内容,用header+exit或readfile输出提示图;伪静态规则仅转发请求,核心逻辑在PHP脚本中实现。

php实现图片防盗链_referer判断与伪静态重定向【详解】

Referer为空或不匹配时直接拒绝访问

PHP处理图片防盗链,核心逻辑是检查 $_SERVER['HTTP_REFERER'] 是否来自白名单域名。但要注意:部分浏览器、HTTPS跳转、隐私模式下 Referer 可能为空;移动端 App 内嵌 WebView 也可能不带 Referer。不能只做“包含”判断,更不能用 strpos() 粗暴匹配子串(比如匹配 'example.com' 会误放行 badexample.com)。

推荐做法:

  • 先用 filter_var() 解析 Referer URL,提取 host 部分,避免协议/路径干扰
  • 用 in_array($host, $white_list, true) 严格比对完整域名
  • 若 $_SERVER['HTTP_REFERER'] 为空或解析失败,按业务策略决定是否放行(多数场景应拒绝)
  • 注意 Apache + PHP-FPM 下,HTTP_REFERER 可能被重写模块过滤,需确认 mod_headers 未屏蔽该头

用 header() 重定向到 403 或自定义提示图

防盗链不是隐藏图片路径,而是控制响应行为。常见错误是 echo 一段文字后试图 header 重定向——PHP 已输出内容,header 失效,浏览器仍会加载原图。

关键操作顺序:

立即学习“PHP免费学习笔记(深入)”;

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 在读取任何图片文件前,完成 Referer 判断和响应决策
  • 若拒绝,立即调用 header('HTTP/1.1 403 Forbidden'),再 exit(不要 echo)
  • 若要显示“禁止盗链”图片,用 readfile('/path/to/forbidden.png') 输出二进制内容,并配对设置 header('Content-Type: image/png')
  • 避免使用 header('Location: ...') 跳转到提示图——这仍算一次有效请求,且可能被缓存或绕过

伪静态规则必须配合 PHP 脚本接管图片请求

Apache 的 RewriteRule ^img/(.*)$ /check.php?file=$1 [L] 这类规则本身不防盗链,只是把请求转发给 PHP。真正起作用的是 check.php 中的 Referer 判断逻辑。

容易出问题的地方:

  • .htaccess 中 RewriteRule 必须加 [L] 终止后续规则,否则可能被其他规则覆盖
  • Nginx 用户需用 try_files $uri @php 将未命中物理文件的图片请求交由 PHP 处理,不能只依赖 location ~ \.png$ 直接返回静态文件
  • PHP 脚本中获取原始请求路径要用 $_GET['file'](伪静态传参),而不是 $_SERVER['REQUEST_URI'](含 query string,易被篡改)
  • 务必对 $_GET['file'] 做白名单校验或路径规范化(如 realpath() + str_starts_with()),防止 ../../etc/passwd 类路径遍历

CDN 和代理环境下 Referer 可能被污染或丢失

如果网站用了 CDN(如 Cloudflare、阿里云 DCDN),真实 Referer 往往被覆盖为 CDN 节点 IP 或域名,$_SERVER['HTTP_REFERER'] 不再可靠。此时不能直接依赖它做判断。

可行方案:

  • 开启 CDN 的 “传递原始 Referer” 功能(Cloudflare 叫 Origin Header,阿里云叫 透传 Referer),并确认 PHP 能收到 HTTP_X_ORIGINAL_REFERER 或类似头
  • 改用 Token 验证:前端请求图片时,服务端生成带时效签名的 URL(如 /img/photo.jpg?t=171xxxx&sign=abc123),PHP 校验签名和时间戳,彻底脱离 Referer
  • 对高敏感资源,放弃 Referer 方案,改用登录态 Session 校验或 JWT 鉴权,图片接口走动态路由

Referer 防盗链本质是“尽力而为”,它防不住主动构造请求的爬虫或调试工具。真正需要强保护的图片,应该从资源分发方式上重构,而不是在 PHP 层反复修补判断逻辑。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

11904

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6821

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2195

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

4348

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

5054

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3971

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5737

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4502

2023.11.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

100

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn