phpEnv中防盗链需手动配置Nginx:将valid_referers规则写入C:\phpEnv\nginx\vhost\your-site.conf的location块,显式包含none、blocked及localhost等白名单,修改后执行nginx -t校验并-s reload;若报unknown directive,说明Nginx版本不支持valid_referers,须改用if判断或升级。

phpEnv 是 Windows 下轻量级 PHP 开发环境,内置 Nginx(通常为 1.20+),但不提供图形化防盗链开关,所有防盗链逻辑必须手动修改 Nginx 配置文件。直接在面板里点“开启防盗链”是无效的——那只是宝塔或 AMH 的功能,phpEnv 没有这层抽象。
valid_referers 配置写在哪?路径和 reload 方式
phpEnv 的站点配置文件默认位于:C:\phpEnv\nginx\vhost\your-site.conf(或 default.conf)
你必须把防盗链规则写进 location 块里,不能只丢在 server 根层级。常见错误是写在 server 外或拼错括号导致 nginx -t 报错。
- 修改后必须执行:
C:\phpEnv\nginx\nginx.exe -t(检查语法) - 再执行:
C:\phpEnv\nginx\nginx.exe -s reload(热重载,不要用任务管理器杀进程)
注意:phpEnv 自带的 Nginx 不支持 valid_referers 中的 server_names 关键字(部分旧编译版本缺失该模块),若 reload 失败并报 unknown directive "valid_referers",说明你得换用支持该指令的 Nginx 版本,或改用 if ($http_referer !~ ...) 替代。
立即学习“PHP免费学习笔记(深入)”;
if ($invalid_referer) 为什么总返回 403 却自己页面也打不开?
这不是规则写错了,而是 Referer 匹配逻辑太严:
- 浏览器直接输入地址访问图片 →
Referer为空 → 属于none,必须显式允许 - 后台富文本编辑器(如 UEditor)预览图 → iframe 加载,
Referer为空或为about:blank→ 被判为blocked - 本地开发用
<a href="https://www.php.cn/link/cbb686245ece57c9827c4bc0d0654a8e">https://www.php.cn/link/cbb686245ece57c9827c4bc0d0654a8e</a>访问前端 → 白名单没填localhost,匹配失败
正确写法应包含三类来源:
-
none(直接访问) -
blocked(空或无效 Referer) - 显式域名,如
yourdomain.com、www.yourdomain.com、localhost、127.0.0.1
示例:
location ~* \.(jpg|jpeg|png|gif|webp|pdf|zip)$ {
valid_referers none blocked yourdomain.com www.yourdomain.com localhost 127.0.0.1;
if ($invalid_referer) {
return 403;
}
expires 1d;
}漏掉 localhost 是 phpEnv 用户最常踩的坑——因为开发时几乎全靠它。
微信小程序、Electron、WebView 场景下 Referer 怎么加白名单?
这些环境不会发送业务域名作为 Referer:
- 微信小程序 WebView 请求图片时,
Referer固定为<a href="https://www.php.cn/link/8bfcbdd65996c417acdfad207838abb9">https://www.php.cn/link/8bfcbdd65996c417acdfad207838abb9</a> - Electron 加载本地 HTML 后发请求,Referer 是
file://协议 → 被判为blocked - 某些 PWA 或 Cordova 应用也会出现类似情况
Nginx 的 valid_referers 不识别协议头,只认域名主体。所以:
- 小程序要加:
servicewechat.com(不是<a href="https://www.php.cn/link/8bfcbdd65996c417acdfad207838abb9">https://www.php.cn/link/8bfcbdd65996c417acdfad207838abb9</a>) - Electron 本地调试可加:
localhost+127.0.0.1,并确保页面由http://而非file://加载 - 若必须支持
file://,只能放弃 Referer 校验,改用 PHP 动态签名校验(如secure_link模块或 token 参数)
phpEnv 默认不启用 secure_link 模块,需确认 Nginx 编译时含 --with-http_secure_link_module,否则这条路也走不通。
Referer 白名单看着简单,实际生效依赖三个隐性条件:Nginx 指令支持度、客户端真实 Referer 值、以及你是否意识到「空 Referer 不等于非法」。很多问题不是配置错,而是没覆盖到开发/测试场景的真实请求来源。



















