zzxworld

配置 Nginx 禁止站外引用图片的访问请求

个人网站能投入的资源很有限,而作为一个一分钱都想掰成两半花的个人站长,自然是不会放过任何一处可以减省的费用开支。比如今天要说的就是如何避免掉一项额外的流量消耗。

我目前这个网站最近随着内容的增多,逐渐开始有了些人气。随着人气的增加,访问量也有了些提升,但同时也带来了另外一个现象:文章开始被复制转载了。

我不拒绝转载,而且就目前的情况来看,转载的朋友一般都提供了来源链接。这是我所提倡的转载方式,所以没什么问题。只是在转载部分包含图片的文章时,有些朋友并没有把图片上传到自己的网站上,而是以外链的方式引用图片。这导致别人在看转载的文章时,还得消耗我这的流量。

流量资源目前对我来说很宝贵,而且我也不太可能去追着转载的人,要求他们把图片上传到自己的服务器上。只能通过技术手段来解决。

所幸在 Nginx 上操作起来并不复杂,下面就是一段简单的配置示例:

location ~* \.(jpg|png)$ {
    valid_referers none server_names;
    if ($invalid_referer){
        return 403;
    }
}

把上面的配置代码放到 server 配置区块中,然后重启 Nginx,就实现了禁止外部网站链接本站 jpg 和 png 后缀文件的功能。在这段配置代码中,主要有三个关键点:

  1. location 设置需要的资源条件。上面的代码是匹配 jpg 和 png 后缀的图片资源。根据需要也可以改为其它的方式,比如以 location /images/ 的格式匹配目录。
  2. valid_referers 设置有效的访问来源特征。它支持以下这些取值:
    • none: 无访问来源。
    • server_names: 当前所处的 server 配置区间中 server_name 的值。等同于当前站点的域名。
    • blocked:被拦截处理过的来源。
    • 字符串域名:字符串格式的域名,比如 zzxworld.com
    • 正则表达式:直接用正则表达式进行规则化匹配。比如 *.zzxworld.com
  3. $invalid_referer 变量保存了上面来源验证规则后的结果。值为 1 时表示验证来源无效,为 0 时表示验证通过。上面的配置代码中用 if 条件语句判断来源结果无效时直接返回 403 拒绝了请求。

最后再次呼吁一下,转载文章的朋友们请尽量把图片复制并上传到自己的服务器上,这样大家都安心。