Как динамически отправлять все коды ошибок 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, которые я использую.

1
задан 13 July 2016 в 15:29
1 ответ

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

Ниже должно быть в файле .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.

1
ответ дан 3 December 2019 в 23:44

Теги

Похожие вопросы