Apache临时文件目录不由DocumentRoot控制,PHP上传目录需改php.ini中upload_tmp_dir,session路径改session.save_path,mod_cache_disk缓存需配置CacheRoot,系统级临时目录可通过批处理设TMP/TEMP环境变量。

Apache 的临时文件目录不由 DocumentRoot 控制
很多人误以为改了 DocumentRoot 就能一并改变 Apache 临时文件(如 mod_rewrite 缓存、PHP 上传临时文件、session 存储)的位置,其实完全不是一回事。Apache 自身不管理“临时文件目录”,它只负责响应请求;真正产生临时文件的是 PHP、操作系统或模块行为。所以第一步得先分清:你实际想改的是哪类临时文件?
PHP 上传和 session 临时目录需单独配置 php.ini
最常见的需求其实是 PHP 上传时的 upload_tmp_dir 和 session 文件存放路径 session.save_path。这两个值默认指向系统临时目录(Windows 是 C:\Windows\Temp,Linux/macOS 是 /tmp),但 XAMPP 并未主动覆盖它们——所以即使你换了 htdocs,PHP 仍可能往系统盘写临时文件。
- 打开
XAMPP\php\php.ini(不是 Apache 的httpd.conf) - 搜索
upload_tmp_dir,取消注释并设为自定义路径,例如:upload_tmp_dir = "D:/xampp/tmp/php-upload" - 同样修改
session.save_path,例如:session.save_path = "D:/xampp/tmp/php-session" - 确保目标目录存在且 Apache 进程有读写权限(Windows 下建议右键文件夹 → 属性 → 安全 → 编辑 → 添加
Everyone或IIS_IUSRS并勾选“修改”) - 改完必须重启 Apache,否则不生效
Apache 模块自身几乎不用“临时目录”,但要注意 mod_cache 配置
Apache 2.4 的 mod_cache 和 mod_disk_cache(已弃用)确实会写缓存文件,但 XAMPP 默认禁用这些模块。如果你手动启用了 mod_cache_disk,才需要关注 CacheRoot 指令:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 确认
LoadModule cache_module modules/mod_cache.so和LoadModule cache_disk_module modules/mod_cache_disk.so已启用(去掉行首#) - 在
httpd.conf或extra/httpd-cache.conf中添加:CacheRoot "D:/xampp/cache" - 该目录必须由 Apache 进程可写,且不能与
htdocs或其他网站目录混用 - 绝大多数本地开发场景根本不需要开启磁盘缓存,强行启用反而增加调试复杂度
Windows 系统级临时目录无法被 XAMPP “接管”,但可间接影响
XAMPP 启动的 Apache 和 MySQL 进程会继承 Windows 的 %TEMP% 和 %TMP% 环境变量。某些扩展(如 ImageMagick、ffmpeg 封装调用)或错误日志归档行为可能依赖它。这不是 Apache 配置项,但你可以在启动前修正:
- 不要直接改系统环境变量(影响全局),而是在 XAMPP Control Panel 启动 Apache 前,用批处理包装:
- 新建
start-apache-custom-temp.bat,内容为:set TMP=D:\xampp\tmp<br>set TEMP=D:\xampp\tmp<br>cd /d D:\xampp\apache\bin<br>httpd.exe
- 这样所有子进程都会使用你指定的临时路径
- 注意:此方式绕过 Control Panel 图形界面,适合进阶用户验证问题
真正容易被忽略的是权限和路径一致性——哪怕所有配置都写对了,只要目录不存在、拼写含空格未加引号、或 NTFS 权限没给足,Apache 就会静默失败或回退到系统默认路径。每次修改后务必检查 error.log,而不是只看 Control Panel 是否显示“running”。










