documentroot 是 apache 静态资源服务的起点,必须精准指向 git 钩子拉取并 checkout 的目标目录(如 /var/www/myapp/public),配合 chown 修正权限、 收紧配置(require all granted、allowoverride none、options -multiviews)及启用 mod_mime/mod_deflate,确保构建产物与预压缩文件被直接、安全响应。

DocumentRoot 本身不参与拉取代码,它只是 Apache 找静态资源的“起点”。真正实现自动拉取靠的是 Git 钩子(如 post-receive),而 DocumentRoot 必须精准指向钩子拉取后存放文件的目标目录——两者配合的关键在于路径一致、权限可控、无中间搬运。
DocumentRoot 必须直接指向部署目标目录
Git 钩子执行 git --work-tree=/var/www/myapp/public checkout -f 后,所有构建好的 PHP 入口或前端静态文件就落在这个目录里。Apache 的 DocumentRoot 就该设成这个路径,不能多一层、也不能少一层:
- 正确示例:DocumentRoot "/var/www/myapp/public"(Laravel/ThinkPHP 等框架)
- 正确示例:DocumentRoot "/var/www/myapp/dist"(Vite/Webpack 构建的前端)
- 危险错误:DocumentRoot "/var/www/myapp" —— 会暴露 .git、.env、源码等敏感内容
Git 钩子脚本要确保文件落进 DocumentRoot 且权限可用
钩子运行用户(常为 git 或 root)和 Apache 工作用户(宝塔默认是 www)不同,必须显式修正归属:
监控一个或多个 GitCode 仓库的 PR,通过 OpenClaw Gateway 自动执行 AI 审查,发布 PR 评论,并发送钉钉和企业微信通知。
- 在
post-receive脚本末尾加:chown -R www:www /var/www/myapp/public - 用绝对路径调用 git:
/usr/bin/git --work-tree=... --git-dir=... checkout -f - 首行声明解释器:
#!/bin/bash,避免 shell 环境缺失导致静默失败 - 给钩子加执行权限:
chmod +x post-receive
Apache 配置需同步收紧,避免干扰部署结果
DocumentRoot 指对了,但若 <directory></directory> 权限没跟上,或者启用了 AllowOverride,部署就可能被覆盖或拒绝访问:
-
Require all granted—— Apache 2.4+ 必须项,否则返回 403 -
AllowOverride None—— 禁用 .htaccess,防止钩子部署后被意外覆盖 -
Options -MultiViews—— 避免请求 main.js 时误匹配 main.js.gz 导致 404 - 禁用
FollowSymLinks(除非明确需要软链)—— 减少潜在攻击面
构建产物与预压缩文件要能被 Apache 直接服务
现代前端构建会生成带哈希的文件(如 index.a1b2c3.html)和预压缩版本(index.a1b2c3.html.gz)。Apache 不生成它们,只负责识别并响应:
- 确认启用
mod_mime和mod_deflate - 构建阶段确保
.gz文件与原始文件同名同目录 - 配置中加入
FileETag None—— 防止哈希文件因 ETag 冲突导致缓存失效










