Назад | Перейти на главную страницу

Используете nginx try_files и пользовательские страницы ошибок для основного блока местоположения?

При использовании try_files в nginx есть ли способ указать и использовать настраиваемую error_page только после того, как он попробовал каждый URI, указанный в директиве try_files?

Приведенная ниже конфигурация не работает:

location / {   
    if (-f $document_root/error_page.html ) {
        error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 495 496 497 500 501 502 503 504 505 506 507 /error_page.html;
    }
    try_files $uri $uri/ @redirect_store;
}

Казалось бы, если вы используете директиву error_page, когда nginx не может найти переданный в URI, он немедленно возвращает настраиваемую страницу ошибки 404 вместо попытки следующей записи в try_files. Кажется, что директива error_page переопределяет try_files?

Я могу заставить это работать, только если не указана директива error_page:

location / {   
    try_files $uri $uri/ @redirect_store;
}

Но в приведенном выше случае, если каждая запись проверена, а она все еще не найдена, она возвращает страницу ошибки 404 по умолчанию, но я хочу, чтобы она возвращала настраиваемую.

Кто-нибудь знает, как этого добиться, или это невозможно? Это ошибка в nginx? Я должен иметь возможность использовать настраиваемую error_page с try_files, предполагая, что URI не был найден ни в одной из записей try_files.

Подводя итог, try_files не проходит цепочку записей, если указана директива error_page.

Есть две проблемы с тем, что вы пытаетесь сделать:

  • в if блок ведет себя не так, как хотелось бы
  • любой ответ 404 вряд ли исходит из вашего location / блокировать

Этот документ объясняет, почему if block следует использовать только в очень специфических ситуациях.

Финальное действие вашего location / блок - вызвать указанное местоположение @redirect_store. Если сгенерирован какой-либо ответ 404, он, вероятно, произойдет после того, как обработка оставила location / блок. Поэтому любой error_page директива объявлена ​​только в пределах location / область действия блока будет проигнорирована (независимо от if блокировать проблемы, указанные выше).

Заключительная строка error_page документ гласит, что:

Если обработка uri приводит к ошибке, клиенту возвращается код состояния последней произошедшей ошибки.

Это означает, что ваш защитный if заявление в любом случае не нужно.

Попробуйте вместо этого:

error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 495 496 497 500 501 502 503 504 505 506 507 /error_page.html;

location / {   
    try_files $uri $uri/ @redirect_store;
}