Альтернатива 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.

Author: Guilherme Nascimento, 2015-05-28

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 или на ваш вкус.

 3
Author: Guilherme Nascimento, 2016-05-14 02:36:48