当 http 状态不是 200 时,Slim 框架不发送 http 标头

Posted

技术标签:

【中文标题】当 http 状态不是 200 时,Slim 框架不发送 http 标头【英文标题】:Slim framework does not send http headers when http status is not 200 【发布时间】:2021-12-09 09:14:06 【问题描述】:

我正在使用 php Slim 框架 v4。我尝试发送 HTTP 标头和 HTTP 错误代码。使用 HTTP 状态 200 它工作正常。指定 304 时,响应错误码没问题,但这种情况下缺少标头。

return $response->withHeader('Content-Type', 'text/plain')
    ->withHeader('X-Error-Message', $message)
    ->withHeader("Access-Control-Allow-Origin", $_SERVER['HTTP_ORIGIN'])
    ->withStatus(200);

这可行,但如下所述的代码不提交标头

return $response->withHeader('Content-Type', 'text/plain')
    ->withHeader('X-Error-Message', $message)
    ->withHeader("Access-Control-Allow-Origin", $_SERVER['HTTP_ORIGIN'])
    ->withStatus(304);

任何想法为什么这不起作用?

如您所见,我需要一个 CORS 标头以避免浏览器抛出错误。

【问题讨论】:

【参考方案1】:

我猜你在 PHP 中收到了这个内部警告:

Warning: Undefined array key "HTTP_ORIGIN" 

此警告将在 Slim $response 被处理之前由 PHP 发送。

请注意HTTP_ORIGIN 标头并不总是存在,并且依赖此密钥不是一个好习惯。相反,最好检查域并在有效时发送*

这会阻止这个警告试试这个:

$httpOrigin = $request->getServerParams()['HTTP_ORIGIN'] ?? '';
if($httpOrigin) 
    $response = $response->withHeader('Access-Control-Allow-Origin', $httpOrigin);


return  $response->withHeader('Content-Type', 'text/plain')
    ->withHeader('X-Error-Message', $message)
    ->withStatus(403);

【讨论】:

【参考方案2】:

报告的问题不是由 slim 框架引起的。我们的托管服务提供商使用 apache 作为 Web 服务器。 Apache 导致了这种行为。

更多详情请见https://bz.apache.org/bugzilla/show_bug.cgi?id=61820。

【讨论】:

以上是关于当 http 状态不是 200 时,Slim 框架不发送 http 标头的主要内容,如果未能解决你的问题,请参考以下文章

Slim Framework 端点单元测试

在 Rocket 中返回 HTTP 状态不是 200 的 JSON

使用 Backbone Js 和 SLIM 框架进行用户身份验证

如何使用 Slim 框架转发 HTTP 请求

服务器返回的http状态码是啥[重复]

Spring 返回 401 而不是 200 状态