При использовании 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
блок ведет себя не так, как хотелось бы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;
}