Краткое содержание моей Недокументированные возможности secure_link на Хабре
nginx.conf:
location ~ ^/p/(?[\w-]+,\d+)/(? .+)$ { secure_link $secure; # '$secure' = "HASH,TIMESTAMP" secure_link_md5 PASSWORD$secure_link_expires$secured_stuff; # '$secure_link_expires' has data after comma in 'secure_link' = TIMESTAMP if ($secure_link = "") { return 403; } # invalid link if ($secure_link == 0) { return 410; } # expired link # link is ok, do something here } URL выглядит как: /p/HASH,TIMESTAMP/ANYTHING где
PASSWORD секретный пароль
TIMESTAMP это время до которого действительна ссылка в unix epoch
ANYTHING произволный текст
HASH кодированный в base64-URL [5] md5 хэш из шаблона secure_link_md5 ($secured_stuff = ANYTHING в данном примере). Символы ‘=’ после base64 можно опускатьНюансы:
1. строка для подсчета из URL ($secured_stuff) декодируется из URL encoding в оригинальный вид
2. md5 хэш должен передаваться в бинарном виде для кодирования в base64код генерации хэша для PHP :
$time = time() + EXPIRE_TTL; # = TIMESTAMP $hash = md5(PASSWORD.$time.$secured_stuff, true); $hash = strtr( base64_encode($hash), array( '+' => '-', '/' => '_', '=' => '' )); $url = 'http://example.tld/p/$hash.','.$time.'/'.$secured_stuff;Для передачи хэша и времени можно также использовать аргументы и куки:
для URL видаhttp://example.com/p/files/top_secret.pdf?st=PIrEk4JX5gJPTGmvqJG41g&e=1324527723где агрумент st это хэш от PASSWORD, URI и аргумента e
location видаlocation /p/ { secure_link $arg_st,$arg_e; # this must match the URI part related secure_link_md5 PASSWORD$uri$arg_e; # PASSWORD is the secret token .... }
Сcылки:
[1] sysoev.ru/nginx/docs/http/ngx_http_secure_link_module.html
[2] wiki.nginx.org/HttpSecureLinkModule
[3] nginx.org/pipermail/nginx/2010-September/022324.html
[4] forum.nginx.org/read.php?21,126363,128324#msg-128324
[5] en.wikipedia.org/wiki/Base64#URL_applications
Tags: nginx