Назад | Перейти на главную страницу

Как динамически отправлять все коды ошибок HTTP в один файл PHP, когда доступ ко всем другим файлам запрещен?

У меня следующая ситуация, я разрабатываю API. Я переписываю весь трафик в один PHP-скрипт с именем: route.php, с помощью mod_rewrite лайк:

1: RewriteEngine On
2: RewriteCond %{REQUEST_FILENAME} -f [OR]
3: RewriteCond %{REQUEST_FILENAME} -d
4: RewriteRule ^.* route.php [L]

Остальные файлы должны не быть доступным, поэтому я использую белый список для доступа route.php только. Поэтому я использую это:

order allow,deny
<FilesMatch "route\.php">
    allow from all
</FilesMatch>

Я хотел бы отправить все 1xx, 2xx (кроме 200), 4xx и, если возможно, 5xx Коды состояния HTTP в сценарий PHP (скажем, error.php?code=404 которая показывает страницу динамической ошибки для этого кода состояния. В этом случае мне, вероятно, придется разрешить доступ к error.php также в FilesMatch часть.

Я нашел частично то, что хочу, описано в Эта статья, но я не могу реализовать или заставить его работать так, как я описал выше.

Моя цель для error.php чтобы показать вывод JSON (динамически на основе кода состояния), например {'statusCode':'404','status':'Not Found'} включая все общие (безопасные) заголовки HTTP, которые я использую.

Этот вопрос не привлек особого внимания, и мне удалось ответить на него сам. Итак, мой ответ. Это возможно следующим образом. Любые улучшения приветствуются.

Ниже должно быть в .htaccess файл:

order allow,deny
deny from all
<FilesMatch "^route\.php$">
    # replace 0.0.0.0 with IP that is allowed to access the Matched files
    allow from 0.0.0.0
</FilesMatch>

ErrorDocument 400     /error.php?code=400
ErrorDocument 401     /error.php?code=401
ErrorDocument 403     /error.php?code=403
ErrorDocument 404     /error.php?code=404
ErrorDocument 500     /error.php?code=500

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^route.php/(.*)$ index.php [L]
</IfModule>
<IfModule !mod_rewrite.c>
    ErrorDocument 403 /error.php?code=403
</IfModule>

Следующее должно быть в error.php файл:

if (!function_exists('http_response_code_text'))
{
    function http_response_code_text($code = 403)
    {
        $text = 'Forbidden';
        switch ($code)
        {
            case 400: $text = 'Bad Request'; break;
            case 401: $text = 'Unauthorized'; break;
            case 403: $text = 'Forbidden'; break;
            case 404: $text = 'Not Found'; break;
            case 500: $text = 'Internal Server Error'; break;
            default:
                $text = 'Forbidden';
            break;
        }
        return $text;
    }
}

$code = 403;
if(isset($_GET['code']{0}))
{
    $code = (int) $_GET['code'];
}

$text = http_response_code_text($code);
echo json_encode(array('httpStatusCode' => $code, 'httpStatusText' => $text));

Это не работает для всех кодов ошибок HTTP, таких как 414 «Request-URI Too Long», и всегда возвращается к 403 Forbidden.