发布日期:2018-03-26
PHP:如何发送HTTP响应代码?+ 查看更多
PHP:如何发送HTTP响应代码?
+ 查看更多
发布日期:2018-03-26 10:59
分类:PHP
浏览次数:119
我有一个PHP脚本,它需要使用类似HTTP 200 OK或者4XX码或者5XX码的HTTP响应码(状态码)做出响应。
在PHP中,我如何做到这一点?
在PHP中,我如何做到这一点?
回答
我刚发现这个问题,认为需要一个更加全面的回答:
在PHP 5.4中有三种方法可以做到这一点:
1.自行组织响应码(PHP>=4.0)
header()函数有一个特殊的用法,它找到一个HTTP响应行并且让你用一个自定义码替代那行。
在PHP 5.4中有三种方法可以做到这一点:
1.自行组织响应码(PHP>=4.0)
header()函数有一个特殊的用法,它找到一个HTTP响应行并且让你用一个自定义码替代那行。
header("HTTP/1.1 200 OK");但是,需要对(Fast)CGI PHP做特殊处理:
$sapi_type = php_sapi_name(); if (substr($sapi_type, 0, 3) == 'cgi') header("Status: 404 Not Found"); else header("HTTP/1.1 404 Not Found");
注意:根据HTTP RFC,原因短语可以是任何自定义字符串(符合标准),但是为了客户端兼容性,我不推荐把一个随意的字符串放在那里。
注意:php_sapi_name() 需要 PHP 4.0.1以上版本才可使用。
注意:php_sapi_name() 需要 PHP 4.0.1以上版本才可使用。
2.header函数的第三个参数(PHP >= 4.3)
显然,使用第一个方法时会有一些问题。我认为其中最大的问题是它被PHP或者网络服务器部分解析而且没有文档化。
从4.3版本起header函数有了第三个参数,它让你有点轻松地设置响应码,但是使用它需要第一个参数是非空字符串。这里有两个可选方案:
显然,使用第一个方法时会有一些问题。我认为其中最大的问题是它被PHP或者网络服务器部分解析而且没有文档化。
从4.3版本起header函数有了第三个参数,它让你有点轻松地设置响应码,但是使用它需要第一个参数是非空字符串。这里有两个可选方案:
header(':', true, 404); header('X-PHP-Response-Code: 404', true, 404); header(':', true, 404); header('X-PHP-Response-Code: 404', true, 404);
我推荐第二种。第一种在我测试过的所有浏览器上都有效,但是一些小型浏览器或者网络爬虫无法处理只含有一个冒号的标题行。第二个方法中的头字段当然是不标准的并且可修改的。我只是选了一个具有较高描述性的名字。
3.http_response_code函数 (PHP >= 5.4)
The http_response_code() 函数在PHP 5.4中被引入,它让事情变得简单多了。
http_response_code(404);
这就行了.
兼容性
这是一个函数,当我需要5.4版本一下的兼容性但也想要“新的”http_response_code函数的功能,我就会定义它。我相信PHP 4.3有很好的向后兼容性,但你永远不知道…… // For 4.3.0 <= PHP <= 5.4.0 if (!function_exists('http_response_code')) { function http_response_code($newcode = NULL) { static $code = 200; if($newcode !== NULL) { header('X-PHP-Response-Code: '.$newcode, true, $newcode); if(!headers_sent()) $code = $newcode; } return $code; } }
兼容性
这是一个函数,当我需要5.4版本一下的兼容性但也想要“新的”http_response_code函数的功能,我就会定义它。我相信PHP 4.3有很好的向后兼容性,但你永远不知道…… // For 4.3.0 <= PHP <= 5.4.0 if (!function_exists('http_response_code')) { function http_response_code($newcode = NULL) { static $code = 200; if($newcode !== NULL) { header('X-PHP-Response-Code: '.$newcode, true, $newcode); if(!headers_sent()) $code = $newcode; } return $code; } }