Обработка 404 с именованным местоположением в Nginx и возврат пользовательских 404 - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть веб-сервис, который обслуживает динамические изображения через веб-сервер 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 с конфигом я уже настроил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...