我知道在php 5.4中有一个新函数http_response_code()
,但在以前的版本中你会如何得到你刚设置的响应代码?
与Is there any way to get the current HTTP response code from PHP?类似
我有这个需要:
//sometime earlier
header('HTTP/1.1 404 Not Found');
//sometime later, detect if error was set
$status = some_magic_way_to_find_status();
有没有人在php 5.3或更低版本中有办法做到这一点?
答案 0 :(得分:2)
编辑:正如@Esailija所写: 请注意,您需要重写所有标头调用以使用此功能才能使其正常工作
在手册中找到此代码, http://www.php.net/manual/en/function.http-response-code.php#107261
<?php
if (!function_exists('http_response_code')) {
function http_response_code($code = NULL) {
if ($code !== NULL) {
switch ($code) {
case 100: $text = 'Continue'; break;
case 101: $text = 'Switching Protocols'; break;
case 200: $text = 'OK'; break;
case 201: $text = 'Created'; break;
case 202: $text = 'Accepted'; break;
case 203: $text = 'Non-Authoritative Information'; break;
case 204: $text = 'No Content'; break;
case 205: $text = 'Reset Content'; break;
case 206: $text = 'Partial Content'; break;
case 300: $text = 'Multiple Choices'; break;
case 301: $text = 'Moved Permanently'; break;
case 302: $text = 'Moved Temporarily'; break;
case 303: $text = 'See Other'; break;
case 304: $text = 'Not Modified'; break;
case 305: $text = 'Use Proxy'; break;
case 400: $text = 'Bad Request'; break;
case 401: $text = 'Unauthorized'; break;
case 402: $text = 'Payment Required'; break;
case 403: $text = 'Forbidden'; break;
case 404: $text = 'Not Found'; break;
case 405: $text = 'Method Not Allowed'; break;
case 406: $text = 'Not Acceptable'; break;
case 407: $text = 'Proxy Authentication Required'; break;
case 408: $text = 'Request Time-out'; break;
case 409: $text = 'Conflict'; break;
case 410: $text = 'Gone'; break;
case 411: $text = 'Length Required'; break;
case 412: $text = 'Precondition Failed'; break;
case 413: $text = 'Request Entity Too Large'; break;
case 414: $text = 'Request-URI Too Large'; break;
case 415: $text = 'Unsupported Media Type'; break;
case 500: $text = 'Internal Server Error'; break;
case 501: $text = 'Not Implemented'; break;
case 502: $text = 'Bad Gateway'; break;
case 503: $text = 'Service Unavailable'; break;
case 504: $text = 'Gateway Time-out'; break;
case 505: $text = 'HTTP Version not supported'; break;
default:
exit('Unknown http status code "' . htmlentities($code) . '"');
break;
}
$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
header($protocol . ' ' . $code . ' ' . $text);
$GLOBALS['http_response_code'] = $code;
} else {
$code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);
}
return $code;
}
}
?>
答案 1 :(得分:1)
我认为这不可能。
你可以包装header()
函数:
function my_status_header($setHeader=null) {
static $theHeader=null;
//if we already set it, then return what we set before (can't set it twice anyway)
if($theHeader) {return $theHeader;}
$theHeader = $setHeader;
header('HTTP/1.1 '.$setHeader);
return $setHeader;
}
或者,当然,您总是可以升级到PHP5.4。
答案 2 :(得分:0)
对于使用PHP 5.3或更早版本设置的http代码(您可以创建一个名为http_response_code.php
的文件并放入此内容):
/*Check if function is available (php5.3<)*/
if (false === function_exists('http_response_code')) {
/* Fallback */
function http_response_code($code = null)
{
static $currentStatus;
if ($code === null) {
if ($currentStatus !== null) {
return $currentStatus;
}
$currentStatus = 200;
if (empty($_SERVER['PHP_SELF']) === false &&
preg_match('#/RESERVED\.HTTP\-STATUS\-(\d{3})\.html$#', $_SERVER['PHP_SELF'], $match) > 0)
{
$currentStatus = (int) $match[1];
}
} elseif (is_int($code) && headers_sent() === false) {
header('X-PHP-Response-Code: ' . $code, true, $code);
$currentStatus = $code;
}
return $currentStatus;
}
}
使用电话:
<?php
require 'foo/bar/http_response_code.php';
$code = http_response_code();
http_response_code(403);
echo 'Initial HTTP code: ', $code, '<br>', PHP_EOL;
echo 'Current HTTP code: ', http_response_code(), '<br>', PHP_EOL;
此代码返回:
初始HTTP代码:200
当前的HTTP代码:403
此功能使用保留的URL检查服务器错误,工作时使用此配置:
.htacces(Apache)
ErrorDocument 403 /error.php/RESERVED.HTTP-STATUS-403.html
ErrorDocument 404 /error.php/RESERVED.HTTP-STATUS-404.html
<强> nginx的强>
error_page 404 /RESERVED.HTTP-STATUS-404.html;
error_page 403 /RESERVED.HTTP-STATUS-403.html;
location ~ ^/RESERVED\.HTTP\-STATUS\-(403|404)\.html$ {
rewrite ^/RESERVED\.HTTP\-STATUS\-(403|404)\.html$ /error.php$0 last;
}
<强> IIS 强>
<httpErrors errorMode="Custom">
<remove statusCode="403" />
<remove statusCode="404" />
<error statusCode="403" path="/error.php/RESERVED.HTTP-STATUS-403.html" responseMode="ExecuteURL" />
<error statusCode="404" path="/error.php/RESERVED.HTTP-STATUS-501.html" responseMode="ExecuteURL" />
</httpErrors>
error.php
是一个例子,如果需要可以改变。在您的脚本页面中使用(error.php):
<?php
require 'foo/bar/http_response_code.php';
echo 'Error page, status: ', http_response_code();
用于加载&#34;模板&#34;:
<?php
require 'foo/bar/http_response_code.php';
include 'template/error/http_' . $code . '.php';