You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony中JsonResponse携带Location头返回302而非201的问题

解决JsonResponse携带Location头时状态码变为302的问题

问题原因

HTTP规范允许201 Created状态码搭配Location头(用于指向新创建资源的URL),但部分PHP框架(如Laravel/Symfony)在直接通过JsonResponse构造函数传入Location头时,会因内部响应处理逻辑干扰,错误将状态码转为302重定向。

解决办法

方法1:手动构建Response并设置JSON内容

绕过JsonResponse的构造逻辑,直接创建基础Response对象,手动指定JSON内容、状态码和响应头:

use Symfony\Component\HttpFoundation\Response;

$response = new Response(
    json_encode(['createdId' => $createdId]),
    Response::HTTP_CREATED,
    [
        'Location' => $url,
        'Content-Type' => 'application/json'
    ]
);
return $response;

方法2:使用框架链式调用方法(以Laravel为例)

利用Laravel的response()->json()方法生成JSON响应,再通过header()方法添加Location头,避免构造函数的逻辑干扰:

use Illuminate\Http\Response;

return response()->json(['createdId' => $createdId], Response::HTTP_CREATED)
    ->header('Location', $url);

方法3:排查中间件干扰

如果上述方法无效,检查项目全局中间件,是否存在会修改响应状态码或头信息的中间件(如Session相关中间件),暂时禁用测试以定位问题根源。

内容的提问来源于stack exchange,提问作者Pavlin Petkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:02:38