thinkphp运行目录权限需分层控制、最小授权、用户组协同:入口必须为/public,代码层只读,public可遍历执行,runtime和storage可写,日志应移出web根目录并设绝对路径。

ThinkPHP运行目录权限设置不是简单执行一条chmod命令的事,关键在于让Web进程能读代码、写日志、跑缓存,同时不让它乱改源码或暴露敏感文件。核心思路是:分层控制、最小授权、用户组协同。
一、运行目录必须设为/public
ThinkPHP6+默认入口在public/index.php,Web服务器不能指向项目根目录,否则配置、应用、路由等目录会直接暴露在URL下。
- 宝塔面板:网站设置 → 网站目录 → 运行目录选
/public(注意不是/public/,也不能手输斜杠结尾) - Nginx:站点配置中
root必须写成绝对路径,例如root /var/www/myapp/public; - Apache:
DocumentRoot同样指向public目录,并确保对应<directory></directory>块启用AllowOverride All
二、五类目录按角色分配权限
权限不是“全开”或“全关”,而是根据目录用途精细划分:
-
代码层(app/config/route/extend):只读,禁止Web进程写入
命令:find . -path "./app" -o -path "./config" -o -path "./route" -o -path "./extend" | xargs chmod -R 640 -
入口与静态资源(public):
public目录需可遍历,index.php必须可执行,static子目录要可读
命令:chmod 750 public && chmod 640 public/index.php && chmod -R 750 public/static -
运行时目录(runtime):必须可写,且仅限deploy用户和www-data组访问
命令:chmod -R 770 runtime/ && find runtime/ -type f -exec chmod 660 {} \; -
上传目录(如public/storage):若
config/filesystem.php中定义了'root' => app()->getRootPath() . 'public/storage',则执行chmod -R 770 public/storage,并确认该路径已从Git排除 -
项目根目录所有权:先统一归属,再分权
命令:chown -R deploy:www-data .(deploy为维护用户,www-data为Web组)
三、运行后必须检查的四件事
改完权限不等于万事大吉,以下验证缺一不可:
- 删掉
runtime/目录,让框架重建缓存——旧缓存路径依赖未重置会导致白屏 - 确认
public/index.php开头有chdir(dirname(__DIR__));,强制工作目录为项目根,避免CLI部署或子目录访问时路径错乱 - 检查PHP是否禁用了
scandir——TP6启动阶段大量扫描目录,禁用即白屏 - 运行
php think optimize:config生成配置缓存,并测试vendor/autoload.php能否正常加载
四、日志安全:移出Web根目录更可靠
把runtime/log留在public同级目录下,哪怕加了Nginxdeny all,也存在配置遗漏风险。推荐做法:
- 将整个
runtime移到项目根同级独立路径,例如/var/www/myapp/runtime/ - 修改
config/log.php中的'path'为绝对路径:'path' => '/var/www/myapp/runtime/log/' - 执行
chown -R www-data:www-data /var/www/myapp/runtime+chmod 755 /var/www/myapp/runtime - 确保
/var/www/myapp、/var/www/myapp/runtime、/var/www/myapp/runtime/log每一级都有x权限,否则PHP无法进入写入
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











