PHP头()未发送自定义消息



我希望我的服务器返回一个带有自定义消息的头。使用header((函数,我可以生成适当的头,但消息总是返回到一些标准字符串,而不是我提供的文本。

例如,如果我把这个放在我的服务器代码中

header ($_SERVER['SERVER_PROTOCOL'] . ' 501 test error', true, 501);

我总是在我的客户身上看到501 Not Implemented。对于客户,我使用了Postman和我的Xamarin Forms客户端应用程序。对于后者,我在调试器中停止它以查看从httpClient.GetAsynch()返回的文本。

我也试过只使用第一个参数

header ($_SERVER['SERVER_PROTOCOL'] . ' 501 test error');

但我得到了同样的结果。

这是另一个尝试。我退回了这个:

header ($_SERVER['SERVER_PROTOCOL'] . ' Status: 501 test error', true, 501);

但命令行上的curl显示了这一点:

HTTP/1.1 200 OK
Connection: Keep-Alive
X-Powered-By: PHP/5.6.40
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Date: Thu, 24 Dec 2020 17:20:54 GMT
Server: LiteSpeed
Alt-Svc: quic=":443"; ma=2592000; v="43,46", h3-Q043=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-25=":443"; ma=2592000, h3-27=":443"; ma=2592000

并且,如果我取出";状态:";,我得到这个:

HTTP/1.1 501 Not Implemented
Connection: Keep-Alive
X-Powered-By: PHP/5.6.40
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Date: Thu, 24 Dec 2020 17:28:09 GMT
Server: LiteSpeed
Alt-Svc: quic=":443"; ma=2592000; v="43,46", h3-Q043=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-25=":443"; ma=2592000, h3-27=":443"; ma=2592000

header("HTTP/1.1 …")是CGI设置的一种变通方法。它本身并不是HTTP头。在大多数情况下,PHP-FPM会对其进行改造和净化:https://github.com/php/php-src/blob/97d2dd0f90b328e771b60634cc377fd20eececbc/sapi/fpm/fpm/fpm_main.c#L307如果以这种方式发送。

这就是设置状态:标题:的方式

header("Status: 429 Begone!");

现在,如果您的Web服务器(LiteSpeed(去掉了自定义消息,那么就是这样。PHP对此无能为力。你必须找到一个服务器配置解决方案。(例如Header add和一些用于Apache的if=(

简而言之,除非SAPI绑定需要,否则使用SERVER_PROTOCOL让它休息一下。如果遇到其他问题,升级PHP是一个选项。否则,您将不得不接受标准化的状态消息。

经过阅读,我认为为错误提供自定义消息的正确方法是在body中发送,而不是在header中发送。

因此,例如,为了提供自定义消息";缺少权重=x参数,可以使用以下代码:

http_response_coede (400);
print json_encode (array ('error' => 400, 
'message' => 'missing weight=x parameter');

然后,在您的客户端中,从结果体解析这个json字符串。

如果使用不再具有状态文本的HTTP/2,也可能发生这种情况。

最新更新