фев 23, 2013

nginx html return

Nginx -  замечательный веб-сервер. Очень быстрый и гибкий.

И есть у него замечательная директива - return.

в большинстве случаев она используется для возврата стандартного кода ответа клиенту. Например 403

location /topsecrets {
    return 403;
}

Если вы обратитесь к /topsecrets, то получите стандартную страничку с 403 ошибкой.

Вроде бы ничего необычного. Но с какой-то версии nginx у директивы return появился второй аргумент, которым может быть текст или url.

Url нас не очень интересует, а вот возможность вернуть текст в теле ответа очень интересна и полезна. Попробуем что-то получить.

location /note {
       return 200 "Hello world";
}

Обращаемся к note... и скачиваем текстовый файл "note" c текстом "Hello world" :).

Все правильно, стандартный тип данных в хедере nginx не является текстовым:

curl -I 127.0.0.1/note
HTTP/1.1 200 OK
Server: nginx/1.0.3
Content-Type: application/octet-stream

Просто добавим нужный хедер

location /note {
    add_header Content-Type: text/html;
    return 200 "Hello world ";
}

И увидим заветные строчки в уже в браузере. Теперь можно писать простые сообщения не используя ничего, кроме nginx!

Но это еще не все. Почему просто текст? Ведь можно использовать HTML и отдавать простые странички прямо из nginx. А если вспомнить про встроенные переменные, то получается рецепт простой заглушки для "не привелигированных"  IP:

server {
        error_page 403 = @forbidden;
        location /topsecret  {
                allow  127.0.0.1/32;
                deny all;
        }

        location @forbidden {
        default_type text/html;
        return 403 "<html> <center/><div><h1>Доступ Запрещен</h1> <h3>Ваш IP-адрес:<b> $remote_addr<b> </h3></div></center></html>";
        }
}