У меня следующая ситуация, я разрабатываю 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.