XAMPP中运行Slim API需三步对齐:①将Slim的public目录内容置于htdocs下或配置虚拟主机指向它;②启用mod_rewrite并设AllowOverride All;③添加JSON解析中间件及统一JSON响应处理。

直接在 XAMPP 里跑 Slim API 是可行的,但默认配置下会 404、JSON 响应错乱、POST 数据读不到——问题不在 Slim,而在 Apache 和目录结构没对齐。
为什么 XAMPP 默认访问 http://localhost 会 404
XAMPP 的 DocumentRoot 指向 D:\xampp\htdocs,而 Slim 4 要求 Web 根目录必须是 public/(不是项目根目录)。如果你把整个 Slim 项目丢进 htdocs,比如 htdocs/my-api/,那么请求 /users 实际会去找 my-api/public/index.php,但 Apache 并不知道要重写到它。
- 不改配置时,
http://localhost/my-api/users会 404,因为 Apache 没启用mod_rewrite,也没把路由转发给public/index.php - 即使启用了 rewrite,若 DocumentRoot 还是
htdocs,.htaccess在my-api/public/下也不会生效(Apache 默认禁止子目录 override) - 最稳做法:把
public/目录内容(含index.php和.htaccess)直接放到htdocs/下,或用虚拟主机指向public/
.htaccess 不生效的三个关键检查点
Slim 依赖 Apache 的 URL 重写把所有请求兜底给 index.php。XAMPP 默认禁用该功能,必须手动开。
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
- 确认
httpd.conf中这行已取消注释:LoadModule rewrite_module modules/mod_rewrite.so - 找到
<Directory "D:/xampp/htdocs">区块,把AllowOverride None改成AllowOverride All -
.htaccess文件必须和index.php在同一级,并且内容至少包含:RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteRule ^ index.php [QSA,L]
POST JSON 请求体始终为 null 怎么办
Slim 4 的 $request->getParsedBody() 默认只处理 application/x-www-form-urlencoded 和 multipart/form-data,遇到 Content-Type: application/json 就返回 null。
- 不能直接
echo json_encode(...),必须用$response->withJson($data) - 解析 JSON 需手动做:
$body = $request->getBody()->getContents(); $data = json_decode($body, true); if (json_last_error() !== JSON_ERROR_NONE) { /* 处理错误 */ } - 推荐注册一个中间件统一处理:
$app->add(function ($request, $handler) {<br> $contentType = $request->getHeaderLine('Content-Type');<br> if (stripos($contentType, 'application/json') === 0) {<br> $contents = $request->getBody()->getContents();<br> $data = json_decode($contents, true);<br> if (json_last_error() === JSON_ERROR_NONE) {<br> $request = $request->withParsedBody($data);<br> }<br> }<br> return $handler->handle($request);<br>});
404 和异常响应返回 HTML 而不是 JSON
默认处理器输出的是调试用 HTML 页面,API 客户端根本没法解析。
- 必须重写
notFoundHandler:$app->setBasePath('/'); // 若部署在子路径,需设对<br>$app->addErrorMiddleware(true, true, true);<br>$app->add(function ($request, $handler) {<br> $response = $handler->handle($request);<br> return $response->withHeader('Content-Type', 'application/json');<br>});<br>$app->getContainer()->get('notFoundHandler')->register(function ($request, $response) {<br> return $response->withStatus(404)->withJson(['error' => 'Not Found']);<br>}); - 注意:Slim 4.12+ 推荐用
addErrorMiddleware第二个参数控制是否显示详细错误,开发时可设true,上线务必关掉 - 别漏掉
$app->setBasePath()—— 如果你用http://localhost/my-api/访问,这里就得填/my-api,否则路由匹配失败
真正卡住人的从来不是 Slim 写法,而是 Apache 的 rewrite 规则是否生效、public/ 是否暴露为 Web 根、以及 JSON 请求体有没有被中间件提前解析——这三处任一出错,API 表面能跑,实际 POST/404/Content-Type 全崩。

















