restful路由映射需统一入口+服务器重写,用$_server['request_method']和path_info解析路径,正则提取id,严格设状态码与json头。

RESTful 路由怎么映射到 PHP 文件不乱套
PHP 本身没有原生 REST 路由,靠 Web 服务器(如 Nginx/Apache)或框架路由层做路径分发。手动实现时,$_SERVER['REQUEST_METHOD'] 和 $_SERVER['PATH_INFO'] 是唯二可信入口点——别依赖 $_GET['action'] 或类似魔改参数。
常见错误:用同一个 PHP 文件处理所有方法,却没校验 HTTP 方法,导致 POST 请求被当成 GET 执行,或 DELETE 被忽略。
- 用
switch($_SERVER['REQUEST_METHOD'])显式分支,未覆盖的方法直接返回405 Method Not Allowed -
PATH_INFO需提前在服务器配置中启用(Nginx 加fastcgi_split_path_info;Apache 确保AcceptPathInfo On) - 路径解析建议用正则提取资源 ID,例如
/users/123→preg_match('@^/users/(\d+)$@', $path, $matches),避免字符串截取出错
HTTP 状态码该在哪一层设置才不会被覆盖
PHP 的 http_response_code() 必须在任何输出(包括空格、BOM、echo)之前调用,否则会失效并触发 Warning: Cannot modify header information。很多新手在 JSON 输出前忘了设状态码,结果全是 200 OK,掩盖了真实错误。
- 推荐把状态码设置和 JSON 输出封装成一个函数,例如
api_response($data, $status = 200),开头就调用http_response_code($status) - 不要在中间逻辑里多次调用
http_response_code(),容易被后续覆盖;最终响应前只设一次 - 注意 CLI 模式下
http_response_code()无效,测试时务必用 curl 或浏览器发起真实 HTTP 请求
Content-Type 和字符编码漏设会导致前端解析失败
只输出 JSON 却不设 Content-Type: application/json; charset=utf-8,某些前端库(如 Axios)会默认按 text/plain 解析,导致 response.data 变成字符串而非对象。
- 必须在
http_response_code()后、任何输出前调用header('Content-Type: application/json; charset=utf-8') - 确保 PHP 文件本身是 UTF-8 无 BOM 编码,否则 BOM 字节会挤在 JSON 前面,造成前端解析 SyntaxError
- 如果用了
json_encode($data, JSON_UNESCAPED_UNICODE),仍需显式声明 charset=utf-8,否则中文可能被浏览器误判为 ISO-8859-1
400/401/403/404/500 这些状态码对应什么业务场景
状态码不是装饰,它直接影响前端重试策略、错误归类和监控告警。比如把数据库连接失败返回 400 Bad Request,前端可能反复重试,而其实该退避或报运维。
-
400:客户端数据格式错误,如 JSON 解析失败、必填字段缺失、ID 格式非法(非数字) -
401:缺失或无效的Authorization头(如 Bearer token 过期),不带WWW-Authenticate头也行,但语义要准 -
403:token 有效但权限不足,比如普通用户请求管理员接口 -
404:资源不存在(如/users/999999),不是“接口地址写错了”——后者是 404,前者也是 404,但语义一致即可 -
500:PHP 抛异常、MySQL 连接超时、磁盘满等服务端不可恢复错误;切勿把file_get_contents()失败也扔 500,应根据下游服务 SLA 判定是否降级或返回 503
真正难的是边界情况:比如用户提交了超长文本,该 400 还是 413?413 是 “Payload Too Large”,需要服务器明确配置了 client_max_body_size 并由 Web 服务器拦截,PHP 层通常只能捕获到空 $_POST,此时更稳妥返回 400 并提示“内容过长”。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











