文档目录
权限设置

简介

本指南面向部署 DouPHP 的运维与开发者,聚焦于 Linux/Unix 与 Windows 环境下的文件系统权限、Web 服务器安全配置(Apache/Nginx)、storage 目录读写要求、以及 .htaccess 的安全策略。文档基于仓库内实际代码与配置文件进行分析,提供可操作的步骤、验证方法与常见问题解决方案。

项目结构与关键路径

  • 应用根路径常量:ROOT_PATH
  • 运行时存储根目录常量:STORAGE_PATH
  • 配置文件目录:CONFIG_PATH
  • 后台入口目录:由 ADMIN_DIR 决定(默认 admin)
  • API 入口目录:API_DIR(默认 api)

上述路径在引导阶段定义,并在安装流程中用于判断是否已安装、加载配置等。

graph TB
A["应用入口"] --> B["bootstrap.php<br/>定义 ROOT_PATH / STORAGE_PATH / CONFIG_PATH"]
B --> C["config/config.php<br/>数据库与站点常量"]
B --> D["storage/<br/>运行时缓存/日志/上传临时数据"]
B --> E["admin/ 或自定义后台目录"]
B --> F["api/"]

图表来源

  • core/bootstrap.php:24-29
  • core/bootstrap.php:42-65
  • config/config.php:15-52

章节来源

  • core/bootstrap.php:24-73
  • config/config.php:15-52

核心组件与权限检查机制

  • 运行时存储目录 storage 及其子目录需要“写”权限,否则网站无法正常运行。
  • 图片目录 images 及子目录(如 slide、article、product)需要“写”权限以支持上传。
  • 模板目录 theme 需要“写”权限以支持在线下载模板。
  • 工具服务会递归收集 storage 下所有子目录并逐一检测写入能力。
  • 文件权限检测通过尝试创建测试文件实现,返回 write/no_write/no_exist。
flowchart TD
Start(["开始"]) --> CheckStorage["检测 storage 是否存在且可写"]
CheckStorage --> |存在且可写| CheckImages["检测 images 及子目录可写"]
CheckStorage --> |不存在或不可写| FixStorage["创建/修复 storage 权限"]
CheckImages --> CheckTheme["检测 theme 可写"]
CheckTheme --> Done(["完成"])
FixStorage --> CheckImages

图表来源

  • admin/service/tool/ToolService.php:70-135
  • core/support/FileHelper.php:319-347

章节来源

  • admin/service/tool/ToolService.php:70-135
  • core/support/FileHelper.php:319-347

架构总览

DouPHP 在启动时定义关键路径常量,随后根据 storage/install.lock 判断是否进入安装流程;未安装则重定向到安装脚本。运行时,后台工具页面会扫描 storage 子目录并报告写入状态;上传功能将文件落盘至 images 或 storage 相关目录。

sequenceDiagram
participant Client as "浏览器"
participant Apache as "Apache/Nginx"
participant PHP as "PHP-FPM/Cookie"
participant Boot as "bootstrap.php"
participant Tool as "ToolService"
participant FS as "文件系统"
Client->>Apache : 请求 /admin 或 /
Apache->>PHP : 转发到 index.php
PHP->>Boot : 执行引导
Boot-->>PHP : 定义 ROOT_PATH/STORAGE_PATH/CONFIG_PATH
PHP->>Tool : 打开后台工具页
Tool->>FS : 递归检测 storage 子目录可写
FS-->>Tool : 返回每个目录的写入状态
Tool-->>Client : 展示权限检查结果

图表来源

  • core/bootstrap.php:24-65
  • admin/service/tool/ToolService.php:70-135

详细组件分析

Linux/Unix 文件系统权限设置

  • 目标用户与组
    • Web 服务器运行用户通常为 www-data、nginx、apache 等。
    • 建议将项目目录所有者设置为该用户,或将其加入对应组。
  • 目录与文件权限
    • 代码文件(PHP/HTML/JS/CSS):建议 644(rw-r--r--),目录 755(rwxr-xr-x)。
    • 敏感配置文件(如 config/config.php):建议 640 或 600,仅 Web 用户可读。
    • storage 目录及全部子目录:必须可写,建议 755 或 775(取决于组策略)。
    • images 目录及子目录(slide/article/product 等):必须可写,建议 755 或 775。
    • theme 目录:如需在线下载模板,需可写,建议 755 或 775。
  • 常用命令
    • 修改所有者:chown -R www-data:www-data /path/to/douphp.dou
    • 修改权限:chmod -R 755 /path/to/douphp.dou && chmod -R 775 /path/to/douphp.dou/storage /path/to/douphp.dou/images /path/to/douphp.dou/theme
    • 针对特定目录更严格:chmod 640 /path/to/douphp.dou/config/config.php

章节来源

  • core/bootstrap.php:24-29
  • admin/service/tool/ToolService.php:70-135

Windows 系统权限配置

  • 使用“属性 > 安全”为 IIS 应用池账户(如 IUSR、IIS_IUSRS 或自定义账户)授予相应权限。
  • 对 storage、images、theme 目录授予“修改”或“完全控制”权限(视需求而定)。
  • 避免使用管理员账户运行 Web 服务,遵循最小权限原则。
  • 注意大小写敏感性差异:Windows 不区分大小写,应避免仅大小写不同的目录名冲突(项目内部已有相关校验逻辑)。

章节来源

  • admin/service/tool/ToolService.php:236-240

storage 目录读写权限要求

  • storage 是运行时存储根目录,承载缓存、日志、临时脚本等。
  • 工具服务会递归收集 storage 下所有子目录并检测写入能力。
  • 若缺少写入权限,可能导致:
    • 无法生成缓存文件
    • 无法写入日志
    • 无法执行后台目录更名等一次性脚本(写入 storage/cache)
  • 建议:
    • 确保 storage 及其全部子目录可写。
    • 定期清理过期缓存与日志,避免磁盘占满。

章节来源

  • admin/service/tool/ToolService.php:70-135
  • core/support/FileHelper.php:319-347

图片与上传目录权限

  • images 目录用于产品、文章、幻灯片等图片存储,需可写。
  • 上传流程涉及分块上传与草稿模式,最终落盘到 images 或 storage 相关目录。
  • 建议:
    • images 及子目录(slide/article/product)设为可写。
    • 限制上传类型与大小,防止恶意文件写入。

章节来源

  • admin/service/tool/ToolService.php:90-109
  • admin/controller/file/FileController.php:82-102
  • core/service/attachment/ChunkedUploadHandler.php:46-71
  • core/service/attachment/ChunkedUploadHandler.php:155-181

.htaccess 安全设置(Apache)

  • 禁止访问敏感扩展名(bak/inc/lib/sh/tpl/lbi/dwt/pem),降低源码泄露风险。
  • 重写规则:
    • 透传 Authorization 头,支持 Basic Auth。
    • 静态入口与 API、后台路由重写。
  • 建议:
    • 保持 .htaccess 启用,并确保 Apache 允许覆盖(AllowOverride All)。
    • 生产环境关闭 DOU_DEBUG 以减少信息泄露。

章节来源

  • .htaccess:1-45
  • config/config.php:51-52

Nginx 配置差异

  • Nginx 不使用 .htaccess,需在 server/location 中实现等价重写与安全策略:
    • 拒绝访问敏感扩展名(deny 或 return 403)。
    • 重写 API 与后台路由(try_files + rewrite)。
    • 传递 Authorization 头(proxy_set_header Authorization $http_authorization;)。
  • 建议:
    • 将 .htaccess 中的规则转换为 Nginx 配置片段。
    • 确保 location 匹配正确,避免误放行静态资源。

不同 Web 服务器的权限配置差异

  • Apache:
    • 使用 .htaccess 进行目录级安全与重写。
    • 需要 AllowOverride 开启以生效。
  • Nginx:
    • 通过 server 块与 location 指令实现相同效果。
    • 更强调集中式配置与性能优化。

依赖关系分析

  • bootstrap.php 定义 ROOT_PATH、STORAGE_PATH、CONFIG_PATH,并加载配置。
  • ToolService 依赖 FileHelper 进行权限检测。
  • 上传控制器与处理器依赖文件系统写入能力。
  • .htaccess 影响 Apache 的请求处理与安全策略。
graph LR
Bootstrap["bootstrap.php"] --> Config["config/config.php"]
Bootstrap --> Storage["storage/"]
Tool["ToolService"] --> FileHelper["FileHelper"]
Upload["FileController/ChunkedUploadHandler"] --> FS["文件系统(images/storage)"]
Apache[".htaccess"] --> Request["请求处理(重写/安全)"]

图表来源

  • core/bootstrap.php:24-65
  • admin/service/tool/ToolService.php:70-135
  • core/support/FileHelper.php:319-347
  • admin/controller/file/FileController.php:82-102
  • .htaccess:1-45

章节来源

  • core/bootstrap.php:24-65
  • admin/service/tool/ToolService.php:70-135
  • core/support/FileHelper.php:319-347
  • admin/controller/file/FileController.php:82-102
  • .htaccess:1-45

性能与安全注意事项

  • 性能
    • 合理设置 storage 缓存目录,避免频繁重建。
    • 定期清理过期日志与临时文件。
    • 在 Nginx 上启用 gzip 与静态资源缓存。
  • 安全
    • 严格限制 storage 与 images 的访问范围,避免直接暴露。
    • 生产环境关闭调试模式(DOU_DEBUG=false)。
    • 使用 HTTPS 并正确传递 Authorization 头。
    • 限制上传文件类型与大小,防止恶意注入。

故障排查指南

  • 现象:后台工具显示 storage 或 images 无写入权限
    • 检查目录所有者与权限是否正确。
    • 确认 Web 服务器用户对该目录有写权限。
    • 使用 FileHelper 的检测逻辑验证:尝试创建测试文件。
  • 现象:上传失败
    • 检查 images 与 storage 目录可写性。
    • 查看 PHP 上传限制(upload_max_filesize、post_max_size)。
    • 检查分块上传逻辑与临时目录权限。
  • 现象:后台目录更名失败
    • 确认 storage/cache 可写,以便生成一次性引导脚本。
    • 检查新目录名合法性(不允许大写,避免跨平台不一致)。
  • 现象:Apache 重写不生效
    • 确认 .htaccess 被启用(AllowOverride All)。
    • 检查敏感扩展名是否被错误放行。
    • 验证 Authorization 头透传配置。

章节来源

  • core/support/FileHelper.php:319-347
  • admin/service/tool/ToolService.php:236-265
  • .htaccess:1-45

结论

  • 确保 storage、images、theme 目录具备正确的读写权限是 DouPHP 正常运行的基础。
  • 使用 .htaccess(Apache)或等效 Nginx 配置强化安全策略,避免敏感文件泄露。
  • 通过内置工具与权限检测机制快速定位问题,结合日志与文件系统检查进行排障。
  • 在生产环境中遵循最小权限原则,关闭调试模式,并定期维护缓存与日志。
添加日期:2026-10-05