Не понял в данном случае, зачем надо что-то передавать в ссылку после file.zip. Ссылка для всех одна, а проверка уже идет из того, есть ли кука соответствующая.
Например, выставляем при авторизации куку is_authorized в 1. И проверяем:
if($http_cookie ~* '^(.*)is_authorized=1(.*)$')
....тогда отдаем нормально
Иначе - 404.
>>А что-то посложнее можно придумать?
Посложнее в реализации? Зачем? :))
А вы случайно не файлообменник делаете? Ну т.е. обычный обмен файлами с ограниченным доступом (чтобы скачивали не все, а только определенные люди)?
Если так, то проще сделать следующим образом (объясню саму идею, без конкретной реализации). У вас есть кнопка, на которую человек может нажать, чтобы получить право пользоваться файлом. Запускается скрипт, который решает, можно ли ему этот файл получить или нет (например, заплатил ли он за него или достаточно ли других прав - чистая бизнес-логика). Этот скрипт, если человеку можно файл отдать, создает проверочный файлик вида <ip_человека-сгенерированный_хэш>.
А в location, который эти файлы отдает, ставите проверку (примерно такую):
set $fileName ''; set $secretKey ''; if ($request_uri ~* ^/path_to_files/([0-9a-z]+)/(.+)$) {
set $fileName $2; set $secretKey $1; } set $rightKey 0; if (-f /path_to_download_keys/download_key/$remote_addr-$secretKey) { set $rightKey 1; rewrite ^(.*)$ /path_to_files/$fileName break;
} if ( $rightKey != 1) { return 404; }
Клиенту отдаете ссылку /path_to_files/<$secretKey>/<filename>. Здесь $secretKey - это сгенерированный хэш из имени проверочного файлика.
И ссылки будут работать для данного ip, неважно, качается ли файл браузером или download-клиентом, до тех пор, пока существует файлик. Если надо ограничивать по времени, можно грохнуть проверочный файлик по расписанию. Если зайти на этот файл, не посещая соответствующую страницу, получишь 404.
Т. е.
для accesskey_signature выставляем что-то вроде "$cookie_issignedin",
для всех залогиненых ставим куку issignedin, например, в "yes",
и раздаём ссылки вида http://example.com/download/file.zip?key=09093abeac094, где "09093abeac094"
-- это заранее известный хэш куки issignedin.
Правильно я понял?