为什么设置防盗链?防盗链是为了防止您存储于对象存储OSS的数据被其他人盗链而产生额外的费用。
如何设置防盗链?
1、登录OSS管理控制台;
2、进入Bucket列表,选择所需要操作的Bucket;
3、选择好目标后,点击权限管理->防盗链;
4、设置Referer白名单配置。
阿里云OSS防盗链文档:传送门
设置好后,你会发现之前的资源全都无法访问了,不要慌,OSS上设置了防盗链的资源需要通过授权访问。
如何访问设置了防盗链的资源?
可以将生成的签名URL提供给访客进行临时访问。生成签名URL时,您可以通过指定URL的过期时间来限制访客的访问时长。
这里以tp5为例
namespace app\common\services\storage;
use OSS\OssClient;
use OSS\Core\OssException;
use think\facade\Cache;
use app\admin\model\SystemConfig as ConfigModel;
/**
* 阿里云OSS自定义类
* Class OSS
*/
class OSS
{
protected static $accessKeyID;
protected static $accessKeySecret;
protected static $endPoint;
protected static $bucket;
protected static $auth = null;
/**
* 初始化
* @return null|OssClient
*/
protected static function autoInfo(){
if(($bucket = Cache::get('bucket')) && ($endPoint = Cache::get('endPoint')) && ($accessKeyID = Cache::get('accessKeyID')) && ($accessKeySecret = Cache::get('accessKeySecret'))){
self::$accessKeyID = $accessKeyID;
self::$accessKeySecret = $accessKeySecret;
self::$endPoint = $endPoint;
self::$bucket = $bucket;
}else{
self::$accessKeyID = ConfigModel::getConfigValue('accessKeyID');
self::$accessKeySecret = ConfigModel::getConfigValue('accessKeySecret');
self::$endPoint = ConfigModel::getConfigValue('endPoint').'/';
self::$bucket = ConfigModel::getConfigValue('bucket');
Cache::set('accessKeyID',self::$accessKeyID);
Cache::set('accessKeySecret',self::$accessKeySecret);
Cache::set('endPoint',self::$endPoint);
Cache::set('bucket',self::$bucket);
}
if(!self::$accessKeyID || !self::$accessKeySecret || !self::$endPoint || !self::$bucket){
exception('请设置 accessKeyID 和 accessKeySecret 和 地域节点 和 Bucket域名');
}
if(self::$auth == null) {
self::$auth = new OssClient(self::$accessKeyID,self::$accessKeySecret,self::$endPoint);
//私有:OssClient::OSS_ACL_TYPE_PRIVATE 公共读:OssClient::OSS_ACL_TYPE_PUBLIC_READ 公共读写:OssClient::OSS_ACL_TYPE_PUBLIC_READ_WRITE
if(!self::$auth->doesBucketExist(self::$bucket)) self::$auth->createBucket(self::$bucket,self::$auth::OSS_ACL_TYPE_PUBLIC_READ_WRITE);
}
return self::$auth;
}
/**
* 图片签名路径
* @param string $filePath 原图片路径
* @return string
*/
public static function imgSignUrl($filePath)
{
try{
self::autoInfo();
$str = 'https://'.self::$bucket.'.'.self::$endPoint;
return self::$auth->signUrl(self::$bucket,substr($filePath,strlen($str)),3600);
}catch (OssException $e){
return $e->getMessage();
}
}
}
加载该类,调用imgSignUrl()方法即可。