phpEnv默认使用Apache而非Nginx,不支持Nginx防盗链配置;其防盗链需通过启用mod_rewrite模块、设置AllowOverride All及正确编写.htaccess中的RewriteCond与RewriteRule实现。

phpEnv 默认用的是 Apache,不是 Nginx —— 所以「phpEnv 配 Nginx 安全设置」这个需求本身不成立。你看到的 Nginx 防盗链教程(比如 valid_referers、if ($invalid_referer))在 phpEnv 里根本用不了,除非你手动替换了整个 Web 服务器,但那就不是 phpEnv 了。
确认 phpEnv 实际用的是 Apache
打开 phpEnv 安装目录下的 Apache/conf/httpd.conf,搜索 Listen 80 或 ServerRoot 就能确认;再看任务栏托盘图标右键菜单,通常只提供「Apache 重启」选项,没有 Nginx 相关项。phpEnv 是 Windows 下的 Apache+PHP+MySQL 集成包,和 XAMPP、WAMP 同类,底层没集成 Nginx。
- 如果你在 phpEnv 控制面板里看到「Nginx」开关或服务名,那大概率是误装了第三方插件,非官方行为
- 强行替换为 Nginx 后,phpEnv 自带的 PHP 管理、MySQL 集成可能失效,路径、端口、模块加载都得重配
- 所有网上搜到的「phpEnv + Nginx」配置,99% 是标题党,实际抄的是通用 Nginx 教程,套错环境
Apache 下 .htaccess 防盗链必须开两个开关
直接丢 .htaccess 文件到 www/ 目录下没用,因为 phpEnv 默认禁用了重写引擎和覆盖权限。必须改两处 httpd.conf:
- 取消注释:
LoadModule rewrite_module modules/mod_rewrite.so - 找到你网站根目录对应的
<Directory "D:/phpEnv/www">块,把里面的AllowOverride None改成AllowOverride All - 改完务必通过 phpEnv 托盘图标「重启 Apache」,不是只刷新页面
否则 RewriteCond %{HTTP_REFERER} 这类规则完全不触发,浏览器访问图片照样成功,你以为配好了,其实等于没动。
立即学习“PHP免费学习笔记(深入)”;
Referer 校验的坑:空来源、子域名、协议都要写全
常见错误是只写 yourdomain.local,结果 https://www.yourdomain.local 或 http://yourdomain.local 全被拦掉。正确写法要覆盖所有合法入口:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.local [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F]-
!^$是必须的,否则你在浏览器地址栏直接输图片 URL 会 403(空 Referer) -
https?匹配 http 和 https;(www\.)?允许带或不带 www;\.要转义点号,不然yourdomain.local会被当成正则通配 - 别用
[R=403],语法错误;[F]才是返回 403 Forbidden 的标准写法
PHP 脚本层防盗链只是补位,别当主力
如果真想防住绕过(比如 curl -e 指定 Referer),就得用 PHP 中转,比如 image.php?src=uploads/1.jpg。但要注意:
- 必须用
parse_url($_SERVER['HTTP_REFERER'] ?? '', PHP_URL_HOST)提取 host,不能用strpos()匹配完整 URL,否则evil.com/yourdomain.local/xxx就能绕过 - 空 Referer 时
$_SERVER['HTTP_REFERER']不存在,不加isset()或空合并会报 Notice - 每次请求都走 PHP 解析、读文件、输出头,性能比直接由 Apache 发静态文件低得多,开发环境凑合,别上生产
真正要防死盗链,得上 CDN 的 Referer 白名单或签名 URL,本地 Apache 的这套只是防止随手复制图片链接的「懒人攻击」。



















