Альтернатива http response code в версии ниже, чем в php5.4
выехать состояния HTTP в версиях, предшествующих PHP 5.4 (http_status_code
поддерживается только в PHP5.4+)?
Я создаю систему, страниц ошибок, индивидуальные, не будет системы для конкретного проекта, но вопрос с совместимостью я хотел бы знать, если это возможно определить состояние без использования PHP http_response_code
.
Точным", которые не зависят от типа сервера, так как скрипт может работать на Apache, Nginx и Lighttpd.
это возможно? Я пытался $GLOBALS
и $_SERVER['REDIRECT_STATUS']
, хотя в случае последнего, он работает только на Apache, на php-fpm просто попали статус - 200
.
1 answers
Для работы на предшествующих 5.4, как php5.3 и php5.3, вы можете создать url, "зарезервированные" с помощью ErrorDocument
(apache, посмотрите альтернативы, ведь других серверов ниже), используя, например:
.htacces (apache)
ErrorDocument 403 /index.php/RESERVED.HTTP-STATUS-403.html
ErrorDocument 404 /index.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$ /index.php$0 last;
}
IIS
<httpErrors errorMode="Custom">
<remove statusCode="403" />
<remove statusCode="404" />
<error statusCode="403" path="/index.php/RESERVED.HTTP-STATUS-403.html" responseMode="ExecuteURL" />
<error statusCode="404" path="/index.php/RESERVED.HTTP-STATUS-501.html" responseMode="ExecuteURL" />
</httpErrors>
PHP
Файл должен содержать следующий код:
/*Verifica se a função não esta disponível (versões anteriores ao php5.4)*/
if (false === function_exists('http_response_code')) {
/*Fallback para versões mais antigas que o PHP5.4*/
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;
}
}
Обратите Внимание, что функция всегда будет поднять на index.php, но вы можете торговать на error.php или на ваш вкус.