为了避免其他网站引用自己网站上的图片等资源导致服务器流量流失,Nginx下可以用ngx_http_referer_module模块通过判断referer来阻止大部分非法请求(需要注意的是referer头部是很容易伪装的,所以这个模块只能做到阻止大部分非法请求。)
编辑nginx.conf配置文件
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { valid_referers none blocked server_names *.lanseyujie.com ~\.google\. ~\.baidu\.; if ($invalid_referer) { return 403; #rewrite ^/ http://media.lanseyujie.com/logo.png; } expires 30d; }
参数解释
valid_referers:允许引用本站资源域名的白名单。
none:允许 request header 中没有包含 referer 的情况。
blocked:允许 request header 中有包含 referer,不过其内容已经被 proxy 或防火墙修改过,不是 http:// 或 https:// 开头的网址。
server_names:来源头部包含当前的server_names(当前域名)。
arbitrary string:任意字符串,定义服务器名或者可选的URI前缀。主机名可以使用*开头或者结尾,在检测来源头部这个过程中,来源域名中的主机端口将会被忽略掉
regular expression:正则表达式,~表示排除https://或http://开头的字符串。
运作原理
设置以gif、jpg、jpeg、png、bmp、swf、js和css为后缀的文件实行防盗链,允许所有来自lanseyujie.com和域名中含有google和baidu的站点可以访问到此类文件。如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么会显示盗链警告图片。如果用户直接在浏览器输入图片地址,那么图片会正常显示,因为它符合none这个规则。如果要设置不允许用户通过图片地址直接访问,可以去掉none参数并在html的head标签中加上
<meta name="referrer" content="origin" />