phpenv基于apache而非nginx,不支持valid_referers指令;应启用mod_rewrite模块、设置allowoverride all,并在.htaccess中用rewritecond %{http_referer}配合rewriterule实现referer校验。

phpEnv 不支持 valid_referers —— 它用的是 Apache,不是 Nginx。 所有在 phpEnv 里搜 valid_referers、改 nginx.conf 或往 server 块里塞规则的行为,都会失败,因为根本没 nginx 进程在跑。
确认你用的是 Apache(不是 Nginx)
phpEnv 是 Windows 下的 Apache + PHP + MySQL 集成环境,底层是 Apache httpd。它没有内置 Nginx,也没有 valid_referers 指令。这个指令只存在于 Nginx 配置中,Apache 对应的是 RewriteCond %{HTTP_REFERER}。
- 打开 phpEnv 控制面板 → “Apache” 标签页 → 点“配置文件”可直接跳转到
Apache/conf/httpd.conf - 搜索
mod_rewrite.so:若该行被注释(开头有#),需删掉#启用模块 - 再搜
AllowOverride None,找到你站点目录的<directory></directory>块,改成AllowOverride All,否则.htaccess不生效 - 改完必须通过 phpEnv 托盘图标或控制面板「重启 Apache」,仅保存配置无效
正确写法:用 .htaccess 做 Referer 校验
在网站根目录(如 D:/phpEnv/www/)或资源子目录(如 /uploads/)新建文件 .htaccess。Windows 下需用记事本「另存为」→ 文件名填 .htaccess → 编码选「UTF-8 无 BOM」或「ANSI」,否则 Apache 会忽略。
-
RewriteEngine On必须开启,否则后续规则不执行 -
RewriteCond %{HTTP_REFERER} !^$允许空 Referer(用户直接输图片 URL、HTTPS 页面引用 HTTP 资源时丢失) -
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?test\.dev [NC]中的test.dev要替换成你在 phpEnv 里实际配的本地域名;若用localhost或127.0.0.1,就写成localhost或127\.0\.0\.1 -
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F]的[F]表示返回 403,比[R=403]正确(后者语法非法) - 规则只作用于匹配后缀的请求,不影响
.php、.css、.js,除非你显式加进去
为什么不用 PHP 脚本做 Referer 判断?
在 index.php 或图片输出脚本里用 $_SERVER['HTTP_REFERER'] 校验,看似灵活,但实际不可靠且易出错:
- 必须先
isset($_SERVER['HTTP_REFERER']),否则触发 Notice 级报错 - 不能用
strpos()匹配完整 URL,否则会被http://evil.com/test.dev/image.jpg绕过;要用parse_url($referer, PHP_URL_HOST)提取 host 再比对 - Referer 可被 curl、Postman、浏览器插件任意伪造,仅适合本地开发“心理安慰”,线上环境别当真
- 动态校验会增加 PHP 执行开销,而
.htaccess规则由 Apache 在请求早期拦截,更轻量
真正要防住盗链,得靠 token 签名或时间戳链接(比如 /image.php?id=123&token=abc123&expires=1713902400),Referer 检查只是第一道筛子。在 phpEnv 这种本地环境里,重点是把 mod_rewrite 和 AllowOverride All 配对调通——漏掉任一,.htaccess 就是废纸。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











