Использование 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.

1
задан 27 April 2019 в 05:12
1 ответ

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

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

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

Заключительное действие вашего [ Блок 1142153] 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;
}
1
ответ дан 3 December 2019 в 23:49

Теги

Похожие вопросы