用PHP快速搭建RESTful路由需配置Web服务器重写规则(Nginx加try_files,Apache启用mod_rewrite),统一解析REQUEST_URI获取路径,手动读php://input处理JSON等非表单数据,显式设置HTTP状态码和Content-Type,采用Bearer Token无状态鉴权,严格区分401/403/422等错误状态。

怎么用 PHP 快速搭一个能跑的 RESTful 路由
PHP 本身不带原生 REST 路由,得靠手动解析 $_SERVER['REQUEST_METHOD'] 和 $_SERVER['PATH_INFO'](或 $_GET['route']),别指望 index.php/user/123 自动映射——Web 服务器默认不会把路径透传给 PHP,得配 rewrite 规则。
常见错误是直接访问 api.php/user/123 报 404,其实是 Apache/Nginx 没配好,不是 PHP 写错了。
- Nginx 需加
try_files $uri $uri/ /api.php?$args,否则路径里的/user/123根本进不到 PHP - Apache 要启用
mod_rewrite,且.htaccess里写RewriteRule ^(.*)$ api.php [QSA,L] - PHP 入口统一用
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)提取路径,别硬切$_SERVER['PATH_INFO']——它在 CGI/FastCGI 下常为空
POST/PUT/DELETE 数据收不到?检查 php://input 和 Content-Type
前端发 application/json,PHP 不会自动解析到 $_POST,必须手动读 php://input 并 json_decode()。这是最常卡住的点,报错往往是“空数组”或“undefined index”。
另外,$_POST 只收 application/x-www-form-urlencoded 和 multipart/form-data;application/json、text/xml 这类都得自己读流。
立即学习“PHP免费学习笔记(深入)”;
- 用
$raw = file_get_contents('php://input')获取原始体,再判断$_SERVER['CONTENT_TYPE']类型 -
PUT和DELETE请求在部分 Nginx 配置下会被转成GET,检查fastcgi_pass_request_headers on;是否开启 - 别在
$_POST里找 JSON 字段——它根本不在那儿
状态码和 Content-Type 别靠默认值
PHP 默认输出 200 OK + text/html,但 REST API 必须显式设状态码和类型,否则前端 fetch().json() 会因 MIME 不匹配抛错。
比如返回错误时只 echo {"error":"not found"},没设 404 状态码,前端可能当成成功处理。
- 用
http_response_code(404)设状态,别只 echo 数字 - 响应 JSON 一定要
header('Content-Type: application/json; charset=utf-8'),少个分号或空格都可能让某些客户端解析失败 - 不要在 header() 前有任何输出(包括空行、BOM),否则报 “headers already sent”
简单鉴权别碰 session,优先用 Bearer Token 解析
REST 是无状态的,PHP 的 session_start() 会强制写 cookie、依赖服务端存储,和 REST 原则冲突。真要鉴权,就用 Header 里的 Authorization: Bearer xxx,自己解析验证。
容易踩的坑是混淆了“登录接口返回 token”和“后续请求带 token”的逻辑——token 验证必须每请求都做,不能只在登录时校验一次。
- 用
getallheaders()或$_SERVER['HTTP_AUTHORIZATION']取 token,注意 Apache 下后者可能为$_SERVER['REDIRECT_HTTP_AUTHORIZATION'] - token 存数据库或 Redis 查,别用
$_SESSION存——跨请求失效,且无法水平扩展 - 别把 token 直接存进
$_COOKIE,Header 更标准、更难被 XSS 泄露
真正麻烦的是错误处理粒度:401(未认证)、403(已认证但无权限)、422(参数错)这些状态码得按场景分清楚,光靠 500 堆日志解决不了问题。











