phpEnv 默认不拦截视频和PDF下载,因其Nginx默认配置仅作基础路由转发,静态资源(如.mp4、.pdf)直由Nginx返回,不经过PHP校验逻辑。

phpEnv 本身不提供文件下载权限控制能力,所有权限限制必须由 Nginx 配置层实现;直接依赖 phpEnv 的 Web 界面或默认配置无法阻止 .mp4、.pdf 等静态资源被直连下载。
为什么 phpEnv 默认不拦视频和 PDF 下载
phpEnv 是基于 Windows 的轻量 PHP 开发环境,底层用的是 Nginx + PHP-FPM,默认配置只做基础路由转发,root 目录下所有静态文件(如 /videos/lesson.mp4)只要路径可猜、HTTP 可达,就直接被 Nginx 返回——它根本不会走 PHP 校验逻辑。
这意味着:
- 用户在浏览器输入
http://localhost/videos/secret.mp4,Nginx 二话不说就吐出文件 -
.env、config.php、admin.zip同样裸奔,除非你主动加规则 - phpEnv 的「伪静态」开关只影响 PHP 路由,对静态资源 0 作用
在 phpEnv 中配 Nginx 禁止特定后缀直连
打开 phpEnv 安装目录下的 nginx/conf/nginx.conf(或站点对应 conf 文件),在 server 块内插入 location 规则:
立即学习“PHP免费学习笔记(深入)”;
location ~* \.(mp4|avi|pdf|docx|zip|env|php)$ {
deny all;
}注意点:
-
~*表示大小写不敏感匹配,避免.MP4漏网 - 把
.php放进去会同时禁掉所有 PHP 脚本执行——如果你需要保留部分 PHP(比如/api/下的接口),得拆成两个 location,用路径前缀限定范围 - 该规则必须放在
location /或try_files规则之前,否则可能被兜底逻辑绕过 - 改完要重启 phpEnv 的 Nginx 服务(点面板上的「重启 Nginx」按钮,不是只刷新页面)
想让视频可播但不可下载?必须走 PHP 中转
单纯 deny all 会把网页内 <video src="..."></video> 也干掉。真要支持在线播放+防下载,只能让所有视频请求强制经过 PHP 校验:
- 把视频文件移出
root目录,比如放到C:/phpenv/private_videos/(Nginx 无法直接访问的位置) - Nginx 配置中加 internal 重定向:
location /stream/ { internal; alias C:/phpenv/private_videos/; } - 前端链接改为
/play.php?vid=lesson123,play.php里生成带时效签名的 URL,再用header('X-Accel-Redirect: /stream/lesson123.mp4')交由 Nginx 输出 - 务必确认 Nginx 编译时启用了
ngx_http_x_accel_redirect_module(phpEnv 默认带,不用额外编译)
容易被忽略的坑:Windows 权限 + Nginx 用户
phpEnv 在 Windows 上以当前登录用户身份运行 Nginx,但如果你把文件放到了系统保护路径(如 C:/Program Files/),或设置了 NTFS 权限限制,Nginx 进程可能读不到文件,直接返回 403——这时 deny all 和真实权限错误现象一模一样,很难区分。
验证方法:
- 临时把测试文件放到
C:/test/这种完全开放的路径,看规则是否生效 - 检查 Nginx 错误日志(
logs/error.log),搜索Permission denied或open() "/xxx" failed - phpEnv 不支持 SELinux,不用关这个,但要注意 Windows Defender 可能拦截 Nginx 访问某些目录
真正安全的下载控制,从来不是靠“藏路径”或“改后缀”,而是让每次请求都必须过一次服务端校验。Nginx 的 deny 和 internal 只是第一道筛子,后面还得有 PHP 把关——漏掉任意一环,文件就等于公开。



















