Pull to refresh

Редкие фичи nginx: random_index

Reading time2 min
Views3.3K
Решил осуществить давнюю мечту, и написать про некоторые модули nginx, которые используются довольно редко. Сегодня речь пойдёт про random_index_module.


Предположим, вы хотите, чтобы пользователь при каждом следующем заходе на одну и ту же страничку получал немного различающийся контент, случайным образом. Ну, например, ваша софтина имеет кучу наград от нескольких софтверных изданий, которые вы очень хотите продемонстрировать пользователю, но, при этом, место в дизайне странички выделено только под одну картинку. Или вы хотите создать мини-баннерную систему в пределах одного сайта со случайным распределением баннеров. :) Применений может быть много.

Самый простой вариант — сделать несколько статических вариантов странички и включить соответствующую директиву в конфиг.

location /index.html {
random_index on;
alias /www/root/random_pages/;
}

Таким образом, каждый раз, когда кто-то будет запрашивать у вас /index.html, nginx будет обращаться к каталогу /www/root/random_pages и отдавать один из файлов, которые он там найдёт, случайным образом.

Однако тут есть ряд проблем — если «мигающих» блоков несколько, количество вариантов странички может очень быстро возрастать.

Решение есть, если вспомнить про SSI. Описываем отдельную локацию для каждого набора наших случайных блоков, например:

location /banners/ {
random_index on;
alias /www/root/banners/;
}

location /awards/ {
random_index on;
alias /www/root/awards/;
}

А в единственной (на этот раз) страничке index.html пишем:

<div id="banner">
<!--# include virtual="/banners/" -->
</div>
...
<div id="my_preciousss_awards">
<!--# include virtual="/awards/" -->
</div>

И всё, что вам остаётся сделать — положить в каталоги /www/root/banners/ и /www/root/awards/ по несколько (или хотя бы по одному) файлику с соответствующим html-контентом.

Разумеется, эту схему можно ещё улучшить, добавив обработку ошибок (если вы всё-таки забыли положить в вышеупомянутые папки хотя бы по одному файлу), но это можно оставить «на домашнее задание». :)
Tags:
Hubs:
Total votes 44: ↑43 and ↓1+42
Comments30

Articles