我遇到以下情况,我正在开发一个 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.php
该FilesMatch
部分。
我找到了部分我想要的东西,描述在本文,但我无法实现或设法使其按照我上面描述的方式工作。
我的目的是显示error.php
JSON 输出(基于状态码动态),其中{'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 禁止。