Como enviar todos os códigos de erro HTTP dinamicamente para um arquivo PHP quando o acesso a todos os outros arquivos é negado?

1

Estou tendo a seguinte situação, estou desenvolvendo uma API. Eu reescrevo todo o tráfego para um script PHP chamado: route.php , usando mod_rewrite como:

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

Outros arquivos devem estar não acessíveis, é por isso que estou usando uma lista de permissões para acessar route.php apenas. Por isso eu uso isso:

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

Eu gostaria de enviar todos os códigos de status HTTP 1xx, 2xx (exceto 200), 4xx e, se possível, 5xx HTTP para um script PHP (digamos error.php?code=404 que mostra a página de erro dinâmico para esse statuscode. Nesse caso, eu provavelmente tenho que permitir o acesso a error.php também na parte FilesMatch .

Eu encontrei parcialmente o que eu quero, descrito em artigo , mas não consigo implementar ou conseguir fazê-lo funcionar da maneira que descrevi acima.

Meu objetivo é que error.php mostre uma saída JSON (dinamicamente baseada no código de status) como {'statusCode':'404','status':'Not Found'} , incluindo todos os cabeçalhos HTTP comuns (de segurança) que eu uso.

    
por Bob Ortiz 24.06.2016 / 14:55

1 resposta

1

Esta pergunta não recebeu muita atenção e eu mesmo consegui responder a pergunta. Assim, minha resposta. Isso é possível da seguinte maneira. Qualquer melhoria é bem-vinda.

Abaixo deve estar no arquivo .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>

O seguinte deve estar no arquivo 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));

Isso não parece funcionar para todos os códigos de erro HTTP, como 414 "Request-URI Too Long" e sempre cai de volta para 403 Forbidden.

    
por 11.07.2016 / 22:31