runtime目录必须禁止Web访问,否则日志、缓存等敏感文件可被直接下载;应优先通过Nginx的location ^~ /runtime/ { deny all; }或Apache的<Directory>指令屏蔽,辅以入口文件拦截、.user.ini限制及严格文件权限(如750目录、000 PHP文件)实现纵深防护。

如果您在部署 ThinkPHP 项目时发现 runtime 目录可通过浏览器直接访问(例如 http://example.com/runtime/log/),则存在严重安全隐患,可能泄露日志内容、数据库配置痕迹或缓存文件。以下是屏蔽 runtime 目录 Web 访问的多种有效方法:
一、通过 Web 服务器配置禁止访问
该方法从服务端层面彻底阻断所有对 runtime 目录及其子目录的 HTTP 请求,是最推荐、最安全的屏蔽方式。Nginx 和 Apache 需分别配置,且不依赖 PHP 层逻辑。
1、若使用 Nginx,在站点 server 块内添加如下 location 规则:
2、在对应 server 配置中插入:location ^~ /runtime/ { deny all; }
立即学习“PHP免费学习笔记(深入)”;
3、保存后执行 sudo nginx -t && sudo systemctl reload nginx 验证并重载配置。
4、若使用 Apache,在项目根目录的 .htaccess 文件中添加以下内容(需确保 AllowOverride All 已启用):
5、写入:Order Allow,Deny\nDeny from all
6、将该段内容保存为 runtime/.htaccess(注意:runtime 目录下新建此文件)。
二、通过入口文件路由拦截
该方法利用 ThinkPHP 的请求生命周期,在应用初始化阶段主动检测并终止对 runtime 路径的访问,适用于无法修改 Web 服务器配置的共享主机环境。
1、打开应用公共入口文件(通常为 public/index.php)。
2、在 require __DIR__ . '/../thinkphp/start.php'; 之前插入以下代码:
3、if (stripos($_SERVER['REQUEST_URI'], '/runtime/') === 0) { header('HTTP/1.1 403 Forbidden'); exit('Access denied.'); }
4、确保该判断语句位于所有框架加载行为之前,避免路径被重写或路由解析绕过。
三、通过 .user.ini 文件限制(PHP-FPM 环境)
该方法适用于使用 PHP-FPM 且支持 user_ini 小文件控制的 Linux 主机,通过 PHP 层面禁用特定目录的脚本执行能力,同时阻止目录索引。
1、进入 runtime 目录:cd /path/to/your/project/runtime
2、创建 .user.ini 文件:echo "disable_functions = show_source,system,shell_exec,exec,passthru,phpinfo" > .user.ini
3、追加目录禁止浏览指令:echo "engine = Off" >> .user.ini
4、设置该文件权限为只读:chmod 444 .user.ini
5、确认 php.ini 中已启用 user_ini.filename = ".user.ini" 且 user_ini.cache_ttl > 0。
四、通过文件系统权限辅助防护
该方法不单独实现屏蔽,但可作为纵深防御手段:即使 Web 服务器配置失效,也能防止 PHP 进程意外输出敏感文件内容(如直接 include runtime/config.php)。
1、确保 runtime 目录不被 Web 用户(如 www-data)以外的账户拥有执行权限:find runtime -type d -exec chmod 750 {} \;
2、将 runtime 下所有 PHP 类型文件(如 .php、.inc)权限设为不可读:find runtime -name "*.php" -o -name "*.inc" | xargs -r chmod 000
3、验证关键文件是否已移除读取权限:ls -l runtime/log/202604/ 应显示 ---------- 或类似无 r 权限标识。



















