如果要使用这些模块,则必须在编译时指定相关的编译参数。
这个模块为一个必需的安全性令牌检查请求网址。
要使用这个模块必须在编译时指定下列编译参数(0.7.18后版本可用):
--with-http_secure_link_module
示例配置:
location /prefix/ { secure_link_secret secret_word; #如果哈希不正确$secure_link将为一个空字符串。 if ($secure_link = "") { return 403; } #需要下面这条设置,否则会得到404错误。 rewrite ^ /prefix/$secure_link break; }
0.8.50+版本示例 – 更优的处理MD5哈希与增加过期头
在Nginx-0.8.50,这个模块增加了”secure_link_md5“指令和”secure_link_expires“变量,”secure_link_secret“指令已经不推荐使用。
下面这个例子表示这是一个从今天起(December 22 2010)一整年都可以访问的安全连接,它在uri中指定了MD5和过期时间:
http://example.com/p/files/top_secret.pdf?st=vXjVzvGW4363YG1I6vb11A&e=13245277231161
在php里面可以使用下面命令得到哈希值:
php -r ‘print str_replace(“=”, “”,\
strtr(base64_encode(md5(“segredo/p/files/top_secret.pdf13245277231161”, TRUE)), “+/”, “-_”)) . “\n”;’
这样就可以得到一个哈希,当然在web应用中应该让它自动生成,注意MD5哈希是二进制形式。
过期时间可以通过php中的time()函数生成,
location /p/ { ## 必须用MD5哈希和过期时间匹配URI secure_link $arg_st,$arg_e; #必须匹配URI部分 ## 使用一个加密标记,URI和一个过期时间生成md5 secure_link_md5 segredo$uri$arg_e; # 'segredo'是加密标记 ## 如果哈希不正确$secure_link为空字符串 if ($secure_link = "") { return 403; } ## 如果当前的时间晚于指定的过期时间 if ($secure_link = "0") { return 403; } ## 一切正确的话$secure_link为1 ## 这条设置是必须的,否则你将得到404 rewrite ^/p/(.*)$ /p/$1 break; }
指令
secure_link_secret
语法:secure_link_secret secret_word
默认值:none
使用字段:location
指令为审核请求指定一个秘密字段,一个被保护连接的完整网址如下:
/prefix/MD5 hash/reference
在secret指令中指定的secret_word将被计算为一个MD5值而串联到受保护的链接中,例如:受保护的文件top_secret_file.pdf位于目录p。nginx配置为:
location /p/ { secure_link_secret segredo; if ($secure_link = "") { return 403; } rewrite ^ /p/$secure_link break; }
你可以通过openssl命令来计算MD5值:
echo -n 'top_secret_file.pdfsegredo' | openssl dgst -md5
得到的值为0849e9c72988f118896724a0502b92a8。可以通过下面首保护的连接访问:
http://example.com/p/0849e9c72988f118896724a0502b92a8/top_secret_file.pdf
注意,不能使用跟路径,即/,例如:
location / { #不能使用/ secure_link_secret segredo; [...] }
secure_link
语法:secure_link $md5_hash[,$expire_time]
默认值:none
使用字段:location
这个指令指定这个链接URL的MD5哈希值和过期时间,$md5_hash为基于URL的64位编码,$expired_time为自1970-01-01 00:00:00 UTC时间以来的秒数,如果你不增加$expire_time,那么这个URL永远不会过期。
secure_link_md5
语法:secure_link_md5 $the_uri_you_want_to_hashed_by_md5
默认值:none
使用字段:location
这个指令指定你需要通过MD5哈希的字符串,字符串可以包含变量,哈希值将和”secure_link”设置的$md5_hash变量进行比较,如果结果相同,$secure_link变量值为1,否则为空字符串。
变量
$secure_link
根据你是否使用”secure_link_secret”,这个值有两个不同的意义:
- 如果使用”secure_link_secret”,并且验证的URL通过验证,这个值为true,否则为空字符串。
- 如果使用”secure_link”和”secure_link_md5”。并且验证的URL通过验证$secure_link为’1’。如果本地时间超过$expire_time, $secure_link值为’0’。否则,将为空字符串。
$secure_link_expires
等于变量$expire_time的值。