Как стать автором
Обновить

Полезный совет: Аватары

Время на прочтение2 мин
Количество просмотров4.6K
Не переставая петь хвалебные песни nginx`у, представлю публики моё решение для очень простого отображения аватаров на проектах.
Задача простая — вывести аватар пользователя, если он у него есть и вывести дефолтовый, если нет аватара у пользователя.
Допустим, все аватары физически у нас хранятся в /img/avatar/, без разницы с какими именами. Решение «в лоб» будет тоже простым — писать в базу, загрузил пользователь аватар или нет. Но это потребует каждый раз обращаться в базу. Конечно, можно юзать мемкеш и прочее, но есть более элегантный выход из ситуации, на мой взгляд ­— переложить эту задачу на плечи nginx`а. И nginx очень легко с этим справляется:

error_page 404 =200 /img/avatar/default.gif;


Объясню. Допустим, мы знаем что в директории /avatar/ хранятся изображение, в имени которого содержится id пользователя. Типа 1.jpg, 2.jpg итп. В нужном месте мы просто прописываем правило выше, которое говорит nginx`у, что при 404 ответе тут — возвращать 200 ответ и отдавать указанный файл.
В моих версиях конфигов это выглядит примерно так:

location ~* ^.+\.(jpg|jpeg|gif|png|js|txt|css|ico|zip|rar|xml|swf)$ {
if ( $request_uri ~* ^/img/avatar/.*$ ) {
error_page 404 =200 /img/avatar/default.gif;
expires -1;
add_header Cache-Control no-cache;
}
access_log off;
expires 7d;
}

Локейшн для исключения статики (все остальное обрабатывает php), статика не кладется в лог (access_log off;) и кешируется на 7 дней (expires 7d;). Но так же, если пользователь обращается за статикой в /img/avatar/, примеряем наше правило, заодно дописываем заголовки анти-кеша. Вот и все :)) Теперь при генерации страницы нас вообще не парит, загрузил ли пользователь аватар или нет, мы просто делаем на него ссылку в src, а если файла такого нет, nginx отдаст дефолтовый.
Подобную схему применяю на всех своих проектах, никогда еще не было проблем.
Теги:
Хабы:
+30
Комментарии138

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн