当拒绝访问所有其他文件时,如何将所有 HTTP 错误代码动态发送到一个 PHP 文件?

当拒绝访问所有其他文件时,如何将所有 HTTP 错误代码动态发送到一个 PHP 文件?

我遇到以下情况,我正在开发一个 API。我route.php使用mod_rewrite类似方法将所有流量重写为一个名为的 PHP 脚本:

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,如果可能的话,还发送 5xxHTTP 状态代码到 PHP 脚本(假设error.php?code=404显示该状态代码的动态错误页面。在这种情况下,我可能还必须允许访问error.phpFilesMatch部分。

我找到了部分我想要的东西,描述在本文,但我无法实现或设法使其按照我上面描述的方式工作。

我的目的是显示error.phpJSON 输出(基于状态码动态),其中{'statusCode':'404','status':'Not Found'}包括我使用的所有常见(安全)HTTP 标头。

答案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“请求 URI 太长”并且总是回退到 403 禁止。

相关内容