gpt4 book ai didi

php - 为什么在 PHP 中的函数 header() 之后调用的函数 http_response_code() 表现得很奇怪?

转载 作者:行者123 更新时间:2023-12-04 12:27:55 26 4
gpt4 key购买 nike

好。我有问题 http_response_code() ,我找不到解释。
如果我使用 header()之前 http_response_code() , PHP 返回由 header() 设置的 HTTP 状态并忽略任何 http_response_code() .
例如,我有一个文件:

<?php
header('HTTP/1.1 404 Not Found');
file_put_contents('./log',http_response_code(501).PHP_EOL,FILE_APPEND);
file_put_contents('./log',http_response_code(502).PHP_EOL,FILE_APPEND);
file_put_contents('./log',http_response_code(503).PHP_EOL,FILE_APPEND);

(我使用 file_put_contents() 来防止任何输出,因为有人可以说,这是这个问题的答案)
我使用了默认的 php-server(但问题可以用 NGINX 重现):
php -S localhost:9985
有要求:
curl -D - http://localhost:9985
有回应:
HTTP/1.1 404 Not Found
Host: localhost:9958
Date: Wed, 15 Sep 2021 17:20:05 GMT
Connection: close
X-Powered-By: PHP/8.0.10
Content-type: text/html; charset=UTF-8
并且有日志:
404
501
502
响应包括第一行:
HTTP/1.1 404 Not Found 
但我在等 HTTP/1.1 503 Service Unavailable .
日志文件包含预期数据,并显示 http_response_code正确返回状态。但它对 HTTP 响应代码没有影响。
我认为一个原因是一些数据可能已经发送到 OUTPUT,因为我使用了 header() .
但是如果我使用 header()两次,它不会产生问题。
我改变了我的文件:
<?php
header('HTTP/1.1 404 Not Found');
header('HTTP/1.1 503 Service Unavailable');
并反复要求:
curl -I http://localhost:9958
有回应:
HTTP/1.1 503 Service Unavailable
Host: localhost:9958
Date: Wed, 15 Sep 2021 17:26:08 GMT
Connection: close
X-Powered-By: PHP/8.0.10
Content-type: text/html; charset=UTF-8
这很好用! 😭
该问题可以在 PHP 7.2、PHP 7.4、PHP 8 上重现。
我找到了一条评论 https://www.php.net/manual/ru/function.http-response-code.php#125538在哪儿。但是有 Apache 。我应该说,如果我使用 Apache,这个问题对我来说是不可重现的。
请描述,为什么函数 (http_response_code) 不能按预期工作。
请不要建议不要使用该函数,因为我想知道该函数行为的真正原因(神圣的含义)。

更新:
错误报告 https://bugs.php.net/bug.php?id=81451&edit=2

最佳答案

简短说明
这是因为状态行传递给 header()优先于 http_response_code()在某些(全部?)PHP SAPI 实现中。
技术说明(特定于 PHP 8.0.10)
PHP 在两个单独的变量中跟踪状态行和 HTTP 响应代码:SG(sapi_headers).http_status_lineSG(sapi_headers).http_response_code .header('HTTP/1.1 404 Not Found')http_status_line到“找不到 HTTP/1.1 404”here 更新 SG(sapi_headers).http_response_code前面几行,而 http_response_code(503) 只有SG(sapi_headers).http_response_code至 503 here .
PHP 的内置服务器用于发送 header 的代码可以在 sapi_cli_server_send_headers 中找到。函数 ( php_cli_server.c )。在该函数中,我们看到 SG(sapi_headers).http_response_codeSG(sapi_headers).http_status_line 时被忽略设置。 sapi_cgi_send_headers PHP-FPM 使用的函数显示了类似的故事。 apache2handler SAPI uses http_status_line 和 http_response_code。理论上,它们可以指向不同的状态!
漏洞?
也许。但是在谁知道多少年后改变/修复这种行为会破坏向后兼容性,所以它可能应该被搁置。最好通过坚持使用 header() 或 http_response_code() 来完全避免这种情况。

关于php - 为什么在 PHP 中的函数 header() 之后调用的函数 http_response_code() 表现得很奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69197771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com