Хитрый учет скачиваемых по прямым ссылкам файлов (nginx + piwik)

iprok nginx-forum at nginx.us
Wed Apr 23 23:12:56 UTC 2014


Здравствуйте!

Есть сайт одной программы, на котором в частности выкладываются ее
дистрибутивы. 
Пользователям они доступны следующими способами:
1) По ссылкам со страницы sitename.org/downloads/ (редактируемая авторами
сайта html с ссылками)
2) Путем просмотра sitename.org/files (список файлов и папок автоматически
генерируемый через fancyindex)
3) Прямые ссылки извне.

Стоит задача учитывать скачивания файлов по всем трем ссылкам. Парсинг логов
не подходит (используется piwik, а он через логи сильно меньше инфы
получает). Поэтому выбрал способ через php скрипт с x-accel-redirect. При
этом скачивания через пункт 1 учитываются из коробки, так что они должны
быть исключены, чтобы избежать дублей.

Посмотрите, пожалуйста, вырезку из конфигов. files.down - символическая
ссылка на files (без этого был циклический редирект. Можно ли без нее?). Все
ли я правильно сделал?

nginx.conf:
http {
...
map $http_referer $direct_download {
        default 1;
        ~*sitename.org/files/.* 1;
        ~*://sitename.org 0;
}
...
server {
...
root /var/www/sitename.org/htdocs;
...
location /files/ {
                location ~* /.*?[^/]$ { #Обрабатывает все файлы, но не
директории, листинг которых через fancyindex (на конце uri не должен быть /
)
                        if ($direct_download) {
                                rewrite ^/files/(.*) /down.php?path=$1
last;
                        }
                }
root /var/www/sitename.org/;

                fancyindex on;
                fancyindex_exact_size off;

                aio            on;
                directio       512;
                output_buffers 1 128k;
}
location /files.down/ {
                root /var/www/sitename.org/;

                aio            on;
                directio       512;
                output_buffers 1 128k;
                internal;
}

}}

ну и down.php:

<?php
...
// And redirect user to internal location
header("Content-Type: application/octet-stream");
header("X-Accel-Redirect: /files.down/" . $path);
?>

Заранее спасибо всем откликнувшимся.

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,249507,249507#msg-249507



Подробная информация о списке рассылки nginx-ru