У меня есть веб-сервис, который обслуживает динамические изображения через веб-сервер Nginx.
Запросы обрабатываются путем интерпретации структуры URL и передачи первоначального ответа 404 в именованное местоположение, которое затем сопоставляет URL с различными условиями, чтобыверните соответствующее изображение.
Вот базовая конфигурация:
error_page 404 = @imageHandlers;
location @imageHandlers {
#= Match pattern 1 =========
if ($uri ~* "^/(some_pattern1)$") {
set $x = $1;
rewrite .* "image_handler_type1.php?q=$x" last;
}
#= Match pattern 2 =========
if ($uri ~* "^/(some_pattern2)$") {
set $x = $1;
rewrite .* "image_handler_type2.php?q=$x" last;
}
etc....
}
Это работает нормально, но я также хочу отображать пользовательскую страницу ошибки 404, когда не совпадают шаблоны.
Я думал, что смогу справиться с этим в моем файле "custom_error.php":
<?php
$status = $_GET["status"];
if ($status == 404) {
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
}
?>
<html>
<head><title><?php echo $status;?></title></head>
<body bgcolor="white">
<center><h1>Error <?php echo $status;?></h1></center>
</body>
</html>
Так что конфигурация Nginx теперь выглядит так:
fastcgi_intercept_errors on;
error_page 404 = @imageHandlers;
location @imageHandlers {
#= Match pattern 1 =========
if ($uri ~* "^/(some_pattern1)$") {
set $x = $1;
rewrite .* "image_handler_type1.php?q=$x" last;
}
#= Match pattern 2 =========
if ($uri ~* "^/(some_pattern2)$") {
set $x = $1;
rewrite .* "image_handler_type2.php?q=$x" last;
}
etc....
#= Otherwise display custom 404 =========
rewrite .* "/custom_error.php?status=404" last;
}
Я добавил "fastcgi_intercept_errors on ", так что Nginx не перехватывает коды ответов больше 300.
К сожалению, ответ 404, возвращаемый" custom_error.php ", все еще перехватывается Nginx и возвращает свой собственный стандартный ответ 404, потому что, я думаю,проход именованного местоположения "@imageHandlers" сбрасывает начальные значения 404 до состояния 200 внутри блока.
Если я закомментируюБлок «if ($ status == 404)» из файла «custom_error.php» отображает пользовательскую ошибку в порядке, НО я получаю код ответа о статусе 200, который неверен.
Как получить пользовательский код?404 с конфигом я уже настроил?