phpenv防盗链需手动编辑nginx配置,在静态资源location块中添加valid_referers白名单(含none、blocked及域名)并配合if($invalid_referer){return 403;},修改后执行nginx -s reload生效。

phpEnv 本身不直接提供防盗链配置界面或按钮,它只是一个 Windows 下的 PHP 环境集成包(含 Nginx、PHP、MySQL),所有防盗链逻辑仍需手动编辑 Nginx 配置文件实现。你真正要配的是 Nginx 的 valid_referers + $invalid_referer 判断,和标准 Nginx 完全一致。
valid_referers 白名单必须写在 location 块里
phpEnv 默认的 Nginx 配置通常把静态资源(如图片、CSS、JS)放在 location ~ .(gif|jpg|jpeg|png|css|js|ico|svg|webp)$ 这类正则匹配块中。防盗链规则必须放在这里,不能写在 server 根层级或 PHP 处理块里。
-
不生效的写法(常见错误):
server { valid_referers none *.example.com; if ($invalid_referer) { return 403; } ... }→valid_referers指令只在location块内生效,且必须配合if使用。 -
正确写法示例(加在对应静态资源 location 中):
location ~ \.(jpg|jpeg|png|gif|webp|mp4|pdf)$ { valid_referers none blocked *.yourdomain.com yourdomain.com ~\.baidu\.com$; if ($invalid_referer) { return 403; } }
注意:
-
none必须加:否则本地直接访问(地址栏输 URL)、HTTPS 页面引用 HTTP 资源时,Referer为空,会被拦。 -
blocked也建议加上:应对浏览器或代理清空协议头的情况。 - 正则末尾加
$(如~.baidu.com$)防止误匹配hacker-baidu.com这类域名。
phpEnv 的 Nginx 配置文件在哪?改完怎么生效?
phpEnv 的主配置文件路径通常是:
C:\phpEnv\nginx\conf\nginx.conf
或更常见的是站点配置文件:
C:\phpEnv\nginx\vhosts\your-site.conf
修改后必须执行重载,不是重启:
nginx -s reload
(可在phpEnv界面点「重载 Nginx」,或进C:\phpEnv\nginx\目录手动运行)如果提示
nginx: [emerg] unknown directive "valid_referers",说明你用的是极老版本 Nginx(phpEnv 当前主流版本都已内置ngx_http_referer_module,无需额外编译。
为什么加了白名单,自己网站图片还是 403?
最常踩的三个坑:
- 浏览器从 HTTPS 页面请求 HTTP 图片 → Referer 被清空 → 必须有
none,否则自己页面也打不开 - 域名写成了
www.example.com,但用户实际访问的是example.com→ 两者不等价,得两个都写,或用*.example.com -
if块里用了rewrite但没配break或last,导致循环重写或路径错乱;简单场景直接用return 403更稳
另外:phpEnv 默认日志级别较低,查问题时建议临时打开 access 和 error 日志:
access_log logs/your-site.access.log;error_log logs/error.log notice;
valid_referers 是纯 HTTP Header 匹配,没有加密、不可信、易伪造——它防的是懒人盗链,不是黑客。真要防批量爬取或绕过,得结合 secure_link 或后端 Token 鉴权。但对大多数个人站、小项目,白名单 + return 403 已经够用,关键是别漏掉 none 和路径范围。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











