防盗链的实现方法

nginx防盗链配置

location ~.*\.(gif|jpg|png|flv|swf|rar|zip)${
    valid referers none blocked test.com *.test.com;
    if ($invalid_referer)
    {
        #return 403;
        rewrite ^/ http://www.test.com/403.jpg;
    }
}

传统防盗链遇到的问题(伪造Referer)

可以使用加密签名解决

location ~.*\.(gif|jpg|png|flv|swf|rar|zip)${
    accesskey on;
    accesskey_hashmethod md5;
    accesskey_arg sign;
    accesskey_signature "jason$remote_addr";
    expires    30d;
}
<?php
$sign = md5('jason'.$_SERVER['REMOTE_ADDR]);
echo '<img src="./logo_new.png?sign='. $sign.'">';
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

发散一下,nginx有个internal语法。可以让指定location必须被重定向访问。

比如视频播放场景:

location /videos {
     internal; # <---
     root /data/videos;
}

当访问:http://domain/videos/test.mp4无法直接访问。

正确的访问方法是:访问到某个api接口,然后接口返回X-Accel-Redirect 如PHP:

// test.php
Header("X-Accel-Redirect: /video/test.mp4");

访问 /test.php 则实际访问的是 /videos/test.mp4.

由此,可以在php里实现复杂的认证逻辑比如播放次数、ip、登录权限、用户身份等等。

1年前 评论

发散一下,nginx有个internal语法。可以让指定location必须被重定向访问。

比如视频播放场景:

location /videos {
     internal; # <---
     root /data/videos;
}

当访问:http://domain/videos/test.mp4无法直接访问。

正确的访问方法是:访问到某个api接口,然后接口返回X-Accel-Redirect 如PHP:

// test.php
Header("X-Accel-Redirect: /video/test.mp4");

访问 /test.php 则实际访问的是 /videos/test.mp4.

由此,可以在php里实现复杂的认证逻辑比如播放次数、ip、登录权限、用户身份等等。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!