ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: error_page + return + arg_XXX



Hello!

On Sat, May 05, 2012 at 11:41:32AM -0400, TheRoSS wrote:

> Всем доброго!
> 
> Обнаружил следующее странное
> поведение. Возможно так и должно быть,
> но мне это показалось странным.
> Мой конфиг:
> 
> server {
>     ...
>     error_page  400 401 402 403 404 500 501 502 503 504 505
> @null_banner;
> 
>     location = / {
>         return 404;
>     }
> 
>     location @null_banner {
>         return 200 '<html><body>ERROR!!!! Я - нулевой
> баннер!</body></html>';
>     }
> }
> 
> При заходе на страницу / запрос
> перенаправляется на 404, 404
> подхватывается директивой error_page,
> которая в свою очередь перенаправляет
> его на @null_banner. В результате я имею на
> выходе свой текст
> ('<html><body>ERROR!!!!</body></html>'), но при этом HTTP
> статус не ожидаемый мной 200, а статус
> ошибки, т.е. 404.
> Разве return 200 '...' не должен был вернуть
> 200?
> Если задано 'error_page  ... =200 @null_banner;', то на
> выходе 200.

Если вы хотите, чтобы вернулся тот код ответа, который будет 
получен при обработке error_page, правильнее всего указывать 
просто "=", т.е. как-то так:

    error_page 404 = @null_banner;

Поведение по умолчанию (без "=") - вернуть ошибку, полученную в 
процессе обработки исходного запроса, с телом из ответа 
error_page.

> Вообще, я пытаюсь решить следующие
> задачи:
> 
> 1. Основная.
> Если при обработке запроса произошла
> какая бы то ни было ошибка, всегда
> должен выдаваться ответ 200 и нулевой
> баннер, с чем вполне успешно
> справляется моя конфигурация при
> условии задания =200 в error_page.
> Но нужно теперь сделать так, чтобы если
> в запросе передаётся параметр debug=1,
> выдавался не нулевой баннер с кодом 200,
> а именно код ошибки. 
> То есть при запросе 'http://localhost/' на
> выходе 200 и нулевой, а при запросе
> 'http://localhost/?debug=1' на выходе должно быть 404
> Not Found. 
> Как это можно сделать?

Проще всего - обрабатывать запросы с debug в другом location, где 
соответственно не ставить error_page.

> 
> 2. Желательная.
> При попадении на нулевой баннер в его
> тексте хотелось бы получить настоящий
> код возврата. То есть чтобы можно было
> написать что-то вроде:
>     location @null_banner {
>         return 200 '<html><body>ERROR: http status = $status Я -
> нулевой баннер!</body></html>';
>     }
> где в $status будет лежать тот самый 404
> Это как-нибудь возможно сделать?

Можно сделать разные location'ы для разных ошибок.  Более 
короткого пути сейчас, пожалуй, нет.

Maxim Dounin

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.