百度百科的解释如下:
2.如何防盗链?3.Nginx中防盗链配置3.1refer模块防盗Syntax:referer_hash_bucket_sizesize;Default:referer_hash_bucket_size64;Context:server,locationSyntax:referer_hash_max_sizesize;Default:referer_hash_max_size2048;Context:server,locationSyntax:valid_referersnone|blocked|server_names|string;Default:—Context:server,location
最重要的是valid_referers指令,它后面可以带上多个参数,表示多个referer头都是有效的。它的参数形式有:
none:允许缺失referer头部的请求访问
blocked:有referer这个字段,但是其值被防火墙或者是代理给删除了
server_names:若referer中的站点域名和server_names中的某个域名匹配,则允许访问
任意字符或者正则表达式
Nginx会通过查看referer字段和valid_referers后面的referer列表进行匹配,如果匹配到了就将内置的变量$invalid_referer值设置为0,否则设置该值为1
这样一个简单的Nginx防盗链配置如下:
location/{valid_referersnoneblocked*./nginxserver_names~\.baidu\.;if($invalid_referer){return403;}return200"valid\n";}3.2secure_link模块防盗前面这种简单检查referer头部值的防盗链方法过于脆弱,盗用者很容易通过伪造referer的值轻而易举跳过防盗措施。在Nginx中有一种更为高级的防盗方式,即基于secure_link模块,该模块能够检查请求链接的权限以及是否过期,多用于下载服务器防盗链。这个模块默认未编译进Nginx,需要在源码编译时候使用--with-secure_link_module添加。
该模块的通过验证URL中的哈希值的方式防盗链。它的防盗过程如下:
由服务器或者Nginx生成安全的加密后的URL,返回给客户端;
客户端使用安全的URL访问Nginx,获取图片等资源,由Nginx的secure_link变量判断是否验证通过;
secure_link模块中总共有3个指令,其格式和说明分别如下:
Syntax:secure_linkexpression;Default:—Context:http,server,locationSyntax:secure_link_md5expression;Default:—Context:http,server,locationSyntax:secure_link_secretword;Default:—Context:location
通过配置secure_link,secure_link_md5指令,可实现对链接进行权限以及过期检查判断的功能。
和referer模块中的$invalid_referer变量一样,secure_link模块也是通过内置变量KaTeXparseerror:Expected'EOF',got'判'atposition14:secure_link判̲断验证是否通过。secure_link的值有如下三种情况:
空字符串:验证不通过
0:URL过期
1:验证通过
通常使用这个模块进行URL校验,我们需要考虑的是如何生成合法的URL?另外,需要在Nginx中做怎样的配置才可以校验这个URL?
对于第一个问题,生成合法的URL和指令secure_link_md5有关。例如:
secure_link_md5"$secure_link_expires$uri$remote_addrsecret";代码块1
如果Nginx中secure_link_md5是上述配置,那么生成合法url的命令如下:
空字符串,校验不通过if($secure_link=""){return403;}return200"$remote_addr";root/root/test;}}server{listen8001;location~*.(jpg|png|flv|mp4)${secure_link$arg_md5,$arg_expires;secure_link_md5"$secure_link_expires$uri$remote_addrsecret";时间过期if($secure_link="0"){return410;}访问静态资源的安全URL为:;expires=1580911200再次到浏览器上访问时候,我就可以看到静态图片了。
此外,我们还可以等到10点之后,测试过期后的结果。在过期之后再用这个URL访问时无法查看图片,而且返回的是410的状态码,这说明Nginx成功检测到这个密钥值已经过期。
5.小结