验证链接的真实性是通过对比请求传来的校验码和请求计算的值是否一致实现。如果链接有时效性,并且已过期,链接会被认为是过时的。这些检查的状态在$secure_link变量里可用。
模块提供两个备选操作模式。第一个模式通过secure_link_secret指令启用,用于检测链接的可靠性以防未授权的访问。第二种模式(0.8.50+)通过secure_link和secure_link_md5指令启用并且同样用于限制链接的有效期。
该模块默认不会构建,需要通过–with-http_secure_link_module配置参数启用。
secure_link
语法:secure_link expression
默认:—
上下文:http, server, location
定义一个包含变量的表达式,可以从中提取校验码和链接的有效期。见下面的例子。
从字符串中提取的校验码会与secure_link_md5指令定义的表达式的MD5哈希值比较。如果校验码不同,$secure_link变量置为空字符串。如果校验码相同,会检测链接的有效期。如果链接有有限的有效期,并且已经过期,$secure_link变量设置为“0”。否则设置为“1”。MD5哈希值通过请求中的base64编码传递。
如果链接有有效期,截止时间是从纪元(Thu, 01 Jan 1970 00:00:00 GMT)开始的秒数。值是在经过MD5哈希后的表达式中指定,并使用逗号分隔。如果没有定义截止时间,则链接无有效期。
secure_link_md5
语法:secure_link_md5 expression
默认:—
上下文:http, server, location
定义一个表达式,它的MD5哈希值用于与请求传递的值进行比对。
表达式应该包含安全的链接部分与一个secret部分。如果链接有有效期,表达式应该包含$secure_link_expires。
为了阻止未授权访问,表达式可以包含一些客户端的信息,例如地址和浏览器版本。
例子:
location /s/ { secure_link $arg_md5,$arg_expires; secure_link_md5 "$secure_link_expires$uri$remote_addr secret"; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 410; } ... }
“/s/link?md5=_e4Nc3iduzkWRm01TBBNYw&expires=2147483647”链接限制客户端访问“/s/link”,只有IP地址为127.0.0.1的客户端可以访问。这个链接同时限制了有效期到2038-01-19(GMT)。
在UNIX上,md5请求参数可以通过下面的方法得到:
echo -n '2147483647/s/link127.0.0.1 secret' | \ openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
secure_link_secret
语法:secure_link_secret word
默认:—
上下文:location
定义一个密语,用于检测请求链接的真实性。
完整的请求URI看起来如下:
/prefix/hash/link
hash是一个链接与密语经过MD5哈希计算后的16进制值,prefix是一个没有斜线的任一字符串。
如果请求链接通过了真实性检查,$secure_link变量设置为请求URI中提取的链接。否则$secure_link是空字符串。
例子:
location /p/ { secure_link_secret secret; if ($secure_link = "") { return 403; } rewrite ^ /secure/$secure_link; } location /secure/ { internal; }
“/p/5e814704a28d9bc1914ff19fa0c4a00a/link”请求会内部重定向到“/secure/link”。
在UNIX上,这个例子中的哈希值可以这样得到:
echo -n 'linksecret' | openssl md5 -hex
内嵌变量