Задача: обеспечить возможность скачивать контент с сервера. только посетителям вашего сайта.
Реализация: использование специальных ссылок, которые содержат ключ и дату протухания.
Модуль к nginx – ngx_http_secure_download
Сборка nginx:
$ cd nginx-0.8.53
$ ./configure --add-module=../ngx_http_secure_download/
Конфиг nginx:
location /somefolder {
secure_download on;
secure_download_secret IAmSalt$remote_addr;
secure_download_path_mode file;
if ($secure_download = "-1") {
rewrite /expired.html break;
}
if ($secure_download = "-2") {
rewrite /bad_hash.html break;
}
if ($secure_download = "-3") {
return 500;
}
rewrite ^(.*)/[0-9a-zA-Z]*/[0-9a-zA-Z]*$ $1 break; // crop all the /hash/time stuff off the url
}
Генерация ссылки средствами php:
function secure_url($url)
{
$ts = time() + 3600;
$ts_in_hex = dechex($ts);
$secret = 'IAmSalt' . $_SERVER['REMOTE_ADDR'];
$hash = md5($url . '/' . $secret . '/' . $ts_in_hex);
return $url . '/' . $hash . '/' . $ts_in_hex;
}
Использованы материалы статьи: Видеохостинг своими руками
PS: Так же, есть модуль ngx_http_secure_link_module, но у него все ссылки перманентные.
Променяли apache на nginx + fastcgi. Замечания:
- наверное должно работать быстрее
- в отличии от апачевских rewrite’ов – в nginx’овских вначале должно стоять ^/, а не просто ^
- красивый конфиг где все понятно
- под php надобно демона запускать, вот скриптик:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| #!/bin/sh
#
# PROVIDE: php_fastcgi
# REQUIRE: DAEMON
# BEFORE: LOGIN
# KEYWORD: shutdown
. /etc/rc.subr
name="php_fastcgi"
rcvar=`set_rcvar`
load_rc_config $name
: ${php_fastcgi_enable="NO"}
: ${php_fastcgi_user="www"}
: ${php_fastcgi_bindaddr="127.0.0.1"}
: ${php_fastcgi_bindport="9000"}
: ${php_fastcgi_children="5"}
: ${php_fastcgi_max_requests="1000"}
: ${php_fastcgi_allowed_env=""}
export PHP_FCGI_CHILDREN=${php_fastcgi_children}
export PHP_FCGI_MAX_REQUESTS=${php_fastcgi_max_requests}
command="/usr/local/bin/php-cgi"
command_args="-q -b ${php_fastcgi_bindaddr}:${php_fastcgi_bindport} &"
pidfile="/var/run/${name}.pid"
_allowed_env="ORACLE_HOME PATH USER PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS"
_allowed_env="${_allowed_env} ${php_fastcgi_allowed_env}"
start_precmd="${name}_start_precmd"
start_postcmd="ps -U ${php_fastcgi_user} -o 'pid,command'|grep ${command}|head -1|cut -f 1 -d ' ' > ${pidfile}"
stop_postcmd=": > ${pidfile}"
php_fastcgi_start_precmd()
{
export USER=${php_fastcgi_user}
E=
for i in ${_allowed_env}; do
eval _val="\$$i"
if [ "${_val}_x" != "_x" ]; then
eval _add="$i=$_val"
E="${E} ${_add}"
fi
done
command="env - ${E} ${command}"
}
load_rc_config $name
run_rc_command "$1" |