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

Laravel 8 API返回JSON在服务器422报错时返回HTML页面问题

Laravel 8 API返回422状态码时服务器返回HTML错误页而非JSON

问题场景

我有一个Laravel 8 API应用,控制器中的testInvalid方法代码如下,本应返回状态码422的JSON响应:

public function testInvalid()
{
    $arrResponse = [
        'success'    => false,
        'message'    => 'message',
        'data'       => [],
        'errors'     => ['error'],
        'error_code' => 422,
    ];

    return response()->json($arrResponse, 422);
}

预期的JSON响应格式为:

{
    "success": false,
    "message": "message",
    "data": [],
    "errors": [
        "error"
    ],
    "error_code": 422
}

该功能在本地运行正常,但部署到服务器后,接口返回的是“Unprocessable entity”的HTML页面;若将响应状态码改为200:

return response()->json($arrResponse, 200);

服务器可正常返回格式一致的JSON,其他合法请求也能正常返回JSON。已尝试在请求中设置Accept: application/json和Content-Type: application/json请求头,问题仍未解决,是否需要检查Apache服务器配置?

解决方案

1. 检查Apache的ErrorDocument配置

服务器大概率配置了针对422状态码的自定义HTML错误页,直接覆盖了Laravel返回的JSON响应。你需要:

  • 查看Apache站点配置文件(比如/etc/apache2/sites-available/你的站点.conf)或者项目根目录的.htaccess文件
  • 查找是否存在类似ErrorDocument 422 /path/to/422.html的配置项
  • 如果有,注释掉该行配置,或者修改为让Laravel优先处理该状态码的响应

2. 确认Laravel异常处理器的行为

虽然你是手动返回422响应而非异常触发,但仍需确保Laravel的异常处理器不会在API请求场景下强制返回HTML。可以检查app/Exceptions/Handler.php的render方法,确保针对JSON请求返回JSON格式:

public function render($request, Throwable $exception)
{
    if ($request->expectsJson()) {
        return response()->json([
            'success' => false,
            'message' => $exception->getMessage(),
            'errors' => [],
            'error_code' => method_exists($exception, 'getStatusCode') ? $exception->getStatusCode() : 500
        ], method_exists($exception, 'getStatusCode') ? $exception->getStatusCode() : 500);
    }

    return parent::render($request, $exception);
}

3. 验证.htaccess重写规则

确保项目根目录的.htaccess文件没有拦截422状态码的响应,标准的Laravel .htaccess配置如下,若有额外的状态码处理规则,需要调整或移除:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

内容的提问来源于stack exchange,提问作者Amit Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:35:41