Yii2静态资源目录需在Web服务器层禁直访:禁止config、runtime、vendor等敏感目录;限制web/assets/仅允许安全静态文件;约束web/uploads/禁止脚本执行,仅允许可信扩展名;Nginx/Apache配置后须验证403响应。

Yii 2.0.53 的静态资源目录(如 @webroot/assets、@webroot/uploads、@webroot/css 等)若未正确限制访问,可能被直接浏览或下载敏感文件(如临时生成的 PHP 资源、调试缓存、未清理的上传残留),甚至触发任意文件读取或路径遍历风险。修复核心不是改代码逻辑,而是切断 Web 服务器对非公开目录的直访能力。
确认哪些目录必须禁止外部访问
以下目录默认不应通过 URL 直接访问,需在 Web 服务器层拦截:
-
protected/(Yii 1)或config/、migrations/、runtime/、tests/(Yii 2)——含配置、密钥、日志、测试用例 -
vendor/—— Composer 包目录,部分 autoload.php 或 .md 文件可能泄露路径或版本信息 -
web/assets/—— 资源发布目录,若含未清理的调试模板、临时 PHP 输出,可能暴露内部结构 -
web/uploads/—— 用户上传目录,必须禁止执行 PHP/JS/HTML,仅允许下载已知安全类型(如图片、PDF)
Nginx 配置:精准屏蔽敏感路径
在站点 server 块中添加 location 规则,**放在所有 root 和 index 指令之后、其他 location 之前**:
location ~ ^/(config|console|migrations|runtime|tests|vendor|protected|\.env|\.git) {
deny all;
}
location ^~ /web/assets/ {
# 允许静态文件访问,但禁止执行
location ~ \.php$ { deny all; }
location ~ /\.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ { add_header Cache-Control "public, max-age=31536000"; }
location / { deny all; }
}
location ^~ /web/uploads/ {
# 只允许指定扩展名,拒绝脚本执行
location ~ \.php$ { deny all; }
location ~ /\.(php|phtml|phar|pl|py|rb|sh|exe|bat|cmd)$ { deny all; }
location ~ /\.(jpg|jpeg|png|gif|webp|pdf|docx|xlsx|txt)$ { }
location / { deny all; }
}修改后执行 nginx -t && systemctl reload nginx 生效。
Apache 配置:用 .htaccess 或虚拟主机封锁
若使用 Apache,在项目根目录(与 web/ 同级)放置 .htaccess:
Order Deny,Allow
Deny from all
<FilesMatch "\.(jpg|jpeg|png|gif|webp|pdf|css|js|woff2?|svg)$">
Allow from all
</FilesMatch>
# 显式禁止高危目录
RedirectMatch 403 ^/(config|console|migrations|runtime|tests|vendor|\.env|\.git)
同时确保 web/.htaccess 中已有标准 Yii 重写规则,并在 <Directory "/path/to/web"> 块中启用 AllowOverride All。
验证是否生效的三个关键检查点
修复后立即验证,避免配置遗漏:
- 访问
https://yoursite.com/runtime/logs/app.log→ 应返回 403 或 404,不能看到日志内容 - 访问
https://yoursite.com/web/uploads/test.php(即使该文件不存在)→ 不应返回 200;若存在,必须拒之 - 访问
https://yoursite.com/vendor/autoload.php→ 返回 403,且响应头中无X-Powered-By: PHP等泄露信息
注意:不要依赖 PHP 层的 index.php 入口拦截,那是最后防线;Web 服务器层拦截才是根本,不经过 PHP 解析,效率高且彻底。


















