Pull to refresh

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

Reading time2 min
Views4.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 отдаст дефолтовый.
Подобную схему применяю на всех своих проектах, никогда еще не было проблем.
Tags:
Hubs:
+30
Comments138

Articles