本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
出于安全考虑,当您通过Bucket默认域名访问某些文件时,可能会触发强制下载或禁止下载。如果您希望在浏览器中正常预览或下载这些文件,您需要为Bucket绑定自定义域名,并通过自定义域名访问OSS文件。绑定自定义域名不会影响Bucket默认域名,您可以继续通过Bucket默认域名访问OSS文件。
使用场景
预览文件:出于安全考虑,通过OSS默认Bucket域名访问文件时,OSS会强制增加下载响应头,导致浏览器强制下载文件。使用自定义域名访问文件不会强制增加下载响应头,从而实现在浏览器中预览文件。关于使用OSS的默认Bucket域名访问文件,触发自动下载的生效时间和生效对象,请参见附录:强制下载命中的x-oss-ec规则。
访问.apk或.ipa文件:出于安全考虑,通过OSS默认Bucket域名访问.apk或.ipa文件时,OSS会返回400错误,错误码为ApkDownloadForbidden。使用自定义域名访问.apk或.ipa文件不会被阻断。关于使用OSS默认Bucket域名访问后缀为.apk或者.ipa文件,触发禁止访问的生效时间和生效对象,请参见附录:报错ApkDownloadForbidden。
品牌形象和专业性:将自定义域名绑定到OSS Bucket,提供个性化域名,增强品牌形象和专业性,增加用户信任度。
防止域名被拦截:一些应用或平台可能会对Bucket默认域名进行拦截。您可以为Bucket绑定自定义域名,以确保您的OSS Bucket中的资源能够被正常访问。
访问方便性:使用自定义域名访问OSS Bucket,方便易记,相比使用OSS默认域名,更加简洁友好,轻松访问和分享资源。
链接的持久性:绑定自定义域名到OSS Bucket后,即使后续存储位置或服务有变化,用户仍可使用相同域名访问资源,确保链接的持久性,长期可访问和使用存储资源。
使用限制
不支持绑定中文域名。
域名未在图片处理绑定。
每个域名只能绑定至一个Bucket。
每个Bucket最多可以绑定100个域名。
通过OSS管理控制台绑定自定义域名时,不允许绑定泛域名(将域名前缀设置为*,从而将主域名的所有子域名都指向Bucket默认域名)。通过CDN加速OSS时,允许绑定泛域名,但该域名不会在OSS管理控制台显示。
绑定的自定义域名中涉及的顶级域名必须满足指定后缀的要求,否则会被视为无效域名,最终导致域名绑定失败。更多信息,请参见顶级域名分类解析。
前提条件
操作步骤
步骤一:绑定自定义域名
根据域名所属服务提供商(可在域名信息查询(WHOIS)页面查询)和所属账号(可在云解析DNS控制台查询),参考对应的步骤将域名绑定至OSS Bucket。
绑定当前阿里云账号注册的域名
将当前阿里云账号注册的域名,绑定至OSS Bucket的操作步骤如下:
登录OSS管理控制台。
单击Bucket 列表,然后单击目标Bucket名称。
在左侧导航栏,选择Bucket 配置>域名管理。
在域名管理页面,单击绑定域名。
在绑定域名面板,输入不带协议的自定义域名,例如
static.example.com
,然后单击确认绑定。添加CNAME记录,将自定义域名
static.example.com
解析至被绑定的Bucket的默认外网域名。自动添加
开启自动添加 CNAME 记录。
开启后,OSS会在云解析DNS自动添加一条CNAME记录。示例如下:
手动添加
如果没有开启自动添加 CNAME 记录,您需要在云解析DNS控制台手动添加一条CNAME记录,否则绑定的自定义域名不会生效。
登录云解析DNS控制台。
在公网DNS解析 > 权威域名解析,单击目标域名右侧的解析设置。
单击添加记录,填写域名解析信息。
参数
说明
示例值
记录类型
选择CNAME记录将域名解析指向另一个域名
CNAME
主机记录
填写要绑定的域名的前缀。
static
解析请求来源
解析域名时使用的线路。 建议选择默认,系统将自动选择最佳线路。
默认
记录值
填写Bucket的外网访问域名。Bucket域名的结构为<bucketname>.<endpoint>。关于不同地域的外网Endpoint,请参见OSS地域和访问域名。
examplebucket.oss-cn-hangzhou.aliyuncs.com
TTL
域名的更新周期,保留默认值即可。
说明生效TTL的时间有一定的延迟,请以实际为准。
10分钟
单击确定。
完成后,云解析DNS会出现一条CNAME记录。示例如下:
绑定其他阿里云账号注册的域名
将阿里云A账号注册的域名,绑定至阿里云B账号的OSS Bucket的操作步骤如下:
使用阿里云B账号,获取TXT记录的主机记录和记录值。
登录OSS管理控制台。
单击Bucket 列表,然后单击目标Bucket名称。
在左侧导航栏,选择Bucket 配置>域名管理。
在域名管理页面,单击绑定域名。
在绑定域名面板,输入不带协议的要绑定的阿里云A账号的自定义域名,例如
static.example.com
,然后复制页面显示的主机记录和记录值。
使用阿里云A账号,添加TXT记录。
登录云解析DNS控制台。
在域名解析列表中,单击目标域名右侧的解析设置。
单击添加记录,填写域名解析信息。
参数
说明
示例值
记录类型
选择域名指向的类型为TXT。
TXT
主机记录
阿里云云解析DNS已自动帮你填写了主域名。因此,填写时,不需要手动填写主域名部分。
如果绑定的是主域名,填写
_dnsauth
。例如域名为example.com
,填写_dnsauth
。如果绑定的是子域名,填写
_dnsauth.<域名前缀>
。例如域名为static.example.com
,填写_dnsauth.static
。
_dnsauth.static
解析请求来源
解析域名时使用的线路。 建议选择默认,系统将自动选择最佳线路。
默认
记录值
填写使用阿里云B账号获取的TXT记录中的CnameToken。
b0d777f7ccddeae93358d908ed59****
TTL
域名的更新周期,保留默认值即可。
说明生效TTL的时间有一定的延迟,请以实际为准。
10分钟
单击确定。
使用阿里云B账号,在OSS控制台的绑定域名面板,单击验证域名所有权并绑定。
使用阿里云A账号,添加CNAME记录。
在域名解析列表中,单击目标域名右侧的解析设置。
单击添加记录,填写域名解析信息。
参数
说明
示例值
记录类型
选择域名指向的类型为CNAME。
CNAME
主机记录
根据域名前缀填写主机记录。
如果是主域名,例如
example.com
,输入@。如果是子域名,输入域名的前缀。例如域名为
static.example.com
,输入static。
static
解析请求来源
解析域名时使用的线路。 建议选择默认,系统将自动选择最佳线路。
默认
记录值
填写Bucket的外网访问域名。Bucket域名的结构为<bucketname>.<endpoint>。关于不同地域的外网Endpoint,请参见OSS地域和访问域名。
examplebucket.oss-cn-hangzhou.aliyuncs.com
TTL
域名的更新周期,保留默认值即可。
说明生效TTL的时间有一定的延迟,请以实际为准。
10分钟
单击确定。
绑定非阿里云账号注册的域名
将在其他域名服务提供商注册的域名,绑定至OSS Bucket的操作步骤如下:
在阿里云OSS,生成TXT记录的主机记录和记录值。
登录OSS管理控制台。
单击Bucket 列表,然后单击目标Bucket名称。
在左侧导航栏,选择Bucket 配置>域名管理。
在域名管理页面,单击绑定域名。
在绑定域名面板,输入不带协议的在其他域名服务提供商注册的域名,例如
static.example.com
,然后复制页面显示的主机记录和记录值。
在域名服务提供商的DNS解析平台,参考下表添加TXT记录。
参数
说明
示例值
记录类型
选择域名指向的类型为TXT。
TXT
主机记录
如果其他域名服务提供商的DNS解析平台已自动帮你填写了主域名,填写时,不需要手动填写主域名部分。
如果绑定的是主域名,填写
_dnsauth
。例如域名为example.com
,填写_dnsauth
。如果绑定的是子域名,填写
_dnsauth.<域名前缀>
。例如域名为static.example.com
,填写_dnsauth.static
。
_dnsauth.static
记录值
填写从阿里云OSS获取的TXT记录中的CnameToken。
b0d777f7ccddeae93358d908ed59****
在阿里云OSS控制台的绑定域名面板,单击验证域名所有权并绑定。
在域名服务提供商的DNS解析平台,参考下表添加CNAME记录。
参数
说明
示例值
记录类型
选择域名指向的类型为CNAME。
CNAME
主机记录
根据域名前缀填写主机记录。
如果是主域名,例如
example.com
,输入@。如果是子域名,输入域名前缀。例如域名为
static.example.com
,输入static。
static
记录值
填写Bucket的外网访问域名。Bucket域名的结构为<bucketname>.<endpoint>。关于不同地域的外网Endpoint,请参见OSS地域和访问域名。
examplebucket.oss-cn-hangzhou.aliyuncs.com
步骤二:验证自定义域名
绑定自定义域名后,当用户通过自定义域名发起请求时,该请求会通过 DNS 解析到 Bucket 默认域名。您可以使用nslookup
或dig
命令来验证自定义域名解析是否生效。
nslookup
将static.example.com
替换为您要查询的域名,然后执行以下命令。
nslookup -type=CNAME static.example.com
域名解析结果显示绑定的Bucket的外网访问域名,说明自定义域名解析已生效。
dig
将static.example.com
替换为您要查询的域名,然后执行以下命令。
dig CNAME static.example.com
域名解析结果显示绑定的Bucket的外网访问域名,说明自定义域名解析已生效。
步骤三:使用自定义域名
自定义域名解析生效后,您可以使用HTTP协议和自定义域名构造包含签名和有效期的URL,URL的格式为http://YourDomain/ObjectName?签名参数
,然后使用该URL访问OSS文件。
获取签名URL。
使用OSS控制台
登录OSS管理控制台。
单击Bucket列表,然后单击目标Bucket名称。
在左侧导航栏,选择
。在文件列表页面,单击目标文件名称。
在详情面板的自有域名,选择绑定的自定义域名,其他保持默认值,然后单击复制文件URL。
使用图形化管理工具ossbrowser
ossbrowser支持Object级别的操作与控制台支持的操作类似,请按照ossbrowser界面指引完成获取签名URL的操作。如何下载ossbrowser,请参见图形化管理工具ossbrowser 2.0(预览版)。
使用自定义域名登录ossbrowser。
获取文件URL。
使用阿里云SDK
使用自定义域名新建OssClient并生成签名URL。
Java
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import java.net.URL; import java.util.Date; public class Demo { public static void main(String[] args) throws Throwable { // yourEndpoint请填写您的自定义域名。例如http://static.example.com。 String endpoint = "http://static.example.com"; // Endpoint请填写您对应的Region信息,例如cn-hangzhou。 String region = "cn-hangzhou"; // 从环境变量中获取访问凭证。运行本代码示例之前,请先配置环境变量。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // 创建OSSClient实例。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); // 请注意,设置true开启CNAME选项。 clientBuilderConfiguration.setSupportCname(true); // 显式声明使用 V4 签名算法 clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // 设置签名URL过期时间,单位为毫秒。本示例以设置过期时间为1小时为例。 Date expiration = new Date(new Date().getTime() + 3600 * 1000L); // 生成以GET方法访问的签名URL。本示例没有额外请求头,其他人可以直接通过浏览器访问相关内容。 String bucketName = "examplebucket"; String objectName = "demo.png"; URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration); System.out.println(url); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }
Python
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数 region = "cn-hangzhou" # 填写自定义域名,例如static.example.com。 endpoint = 'http://static.example.com' # yourBucketName填写存储空间名称。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region, is_cname=True) # 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。 object_name = 'exampledir/exampleobject.txt' # 生成下载文件的签名URL,有效时间为60秒。 # 生成签名URL时,OSS默认会对Object完整路径中的正斜线(/)进行转义,从而导致生成的签名URL无法直接使用。 # 设置slash_safe为True,OSS不会对Object完整路径中的正斜线(/)进行转义,此时生成的签名URL可以直接使用。 url = bucket.sign_url('GET', object_name, 60, slash_safe=True, params=params) print('签名URL的地址为:', url)
Node.js
const OSS = require("ali-oss"); // 定义一个生成签名 URL 的函数 async function generateSignatureUrl(fileName) { // 获取签名URL const client = await new OSS({ // 使用自定义域名作为Endpoint。 endpoint: 'http://static.example.com', // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 accessKeyId: process.env.OSS_ACCESS_KEY_ID, accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET, bucket: 'examplebucket', // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。 region: 'oss-cn-hangzhou', authorizationV4: true, cname: true }); return await client.signatureUrlV4('GET', 3600, { headers: {} // 请根据实际发送的请求头设置此处的请求头 }, fileName); } // 调用函数并传入文件名 generateSignatureUrl('yourFileName').then(url => { console.log('Generated Signature URL:', url); }).catch(err => { console.error('Error generating signature URL:', err); });
PHP
<?php if (is_file(__DIR__ . '/../autoload.php')) { require_once __DIR__ . '/../autoload.php'; } if (is_file(__DIR__ . '/../vendor/autoload.php')) { require_once __DIR__ . '/../vendor/autoload.php'; } use OSS\OssClient; use OSS\Core\OssException; use OSS\Http\RequestCore; use OSS\Http\ResponseCore; use OSS\Credentials\EnvironmentVariableCredentialsProvider; // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 $provider = new EnvironmentVariableCredentialsProvider(); // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为http://static.example.com。 $endpoint = "http://static.example.com"; // 填写Bucket名称。 $bucket= "examplebucket"; // 填写不包含Bucket名称在内的Object完整路径。 $object = "exampleobject.txt"; // 指定签名URL的过期时间为600s(最长可达32400s)。 $timeout = 600; try { $config = array( "provider" => $provider, "endpoint" => $endpoint, 'signatureVersion'=>OssClient::OSS_SIGNATURE_VERSION_V4, "cname" => true, "region"=> "cn-hangzhou" ); $ossClient = new OssClient($config); // 生成签名URL。 $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET"); print_r($signedUrl); } catch (OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; }
Go
package main import ( "context" "flag" "log" "time" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" ) // 定义全局变量 var ( region string // 存储区域 bucketName string // 存储空间名称 objectName string // 对象名称 ) // init函数用于初始化命令行参数 func init() { flag.StringVar(®ion, "region", "", "The region in which the bucket is located.") flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.") flag.StringVar(&objectName, "object", "", "The name of the object.") } func main() { // 解析命令行参数 flag.Parse() // 检查bucket名称是否为空 if len(bucketName) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, bucket name required") } // 检查region是否为空 if len(region) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, region required") } // 检查object名称是否为空 if len(objectName) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, object name required") } // 加载默认配置并设置凭证提供者和区域 cfg := oss.LoadDefaultConfig(). WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()). WithRegion(region). WithEndpoint("http://static.example.com"). WithUseCName(true) // 创建OSS客户端 client := oss.NewClient(cfg) // 生成GetObject的预签名URL result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{ Bucket: oss.Ptr(bucketName), Key: oss.Ptr(objectName), //RequestPayer: oss.Ptr("requester"), // 指定请求者身份 }, oss.PresignExpires(10*time.Minute), ) if err != nil { log.Fatalf("failed to get object presign %v", err) } log.Printf("request method:%v\n", result.Method) log.Printf("request expiration:%v\n", result.Expiration) log.Printf("request url:%v\n", result.URL) if len(result.SignedHeaders) > 0 { //当返回结果包含签名头时,使用签名URL发送GET请求时也包含相应的请求头,以免出现不一致,导致请求失败和签名错误 log.Printf("signed headers:\n") for k, v := range result.SignedHeaders { log.Printf("%v: %v\n", k, v) } } }
使用命令行工具ossutil
使用自定义域名通过presign(生成预签名URL)命令生成文件的签名URL。
ossutil presign oss://examplebucket/exampleobject.txt --endpoint "http://static.example.com” --addressing-style "cname"
如需ossutil命令自动使用自定义域名,而无需每次在命令中手动指定自定义域名,您可以在配置文件中添加自定义域名,
在浏览器中访问签名URL。
相关API
关于创建域名所有权验证所需的CnameToken的接口,请参见CreateCnameToken。
关于获取已创建的CnameToken的接口,请参见GetCnameToken。
关于为某个Bucket绑定自定义域名的接口,请参见PutCname。
关于查询某个Bucket下绑定的所有自定义域名的接口,请参见ListCname。
关于删除某个Bucket已绑定的自定义域名的接口,请参见DeleteCname。
关于使用阿里云解析DNS添加TXT解析记录或CNAME解析记录的接口,请参见AddDomainRecord - 根据传入参数添加解析记录。
后续操作
通过HTTPS协议访问OSS文件
自定义域名在未配置SSL证书的情况下,默认不支持HTTPS协议访问。通过HTTPS协议访问自定义域名时,浏览器会显示不安全连接警告。为了通过HTTPS协议访问OSS文件,需要为自定义域名配置证书。
使用不带签名的URL访问OSS文件
如需获取不存在签名和过期时间的URL,即URL的格式为http://YourDomainName/ObjectName
,您需要将文件设置为公共读。设置为公共读后,互联网上任何用户都可以访问该文件,这有可能造成您数据的外泄以及费用激增,建议您使用包含签名和过期时间的URL。
您可以通过以下两种方式将文件设置为公共读:
设置文件为公共读:将 OSS 文件的权限设置为公共读。在这种情况下,文件的 URL 将没有有效期,任何人都可以访问。为了防止文件被其他网站盗用,您需要在 OSS 中配置防盗链。
CDN加速OSS资源:保持 OSS 文件的权限为私有,通过 CDN 提供公共读访问。在这种情况下,文件的 URL 将没有有效期,任何人都可以访问。为了防止文件被其他网站盗用,您需要在 CDN 配置防盗链。
防止OSS文件被其他网站盗用
默认情况下,任何网站都可以显示您的OSS文件,这可能导致额外的请求费用和下行流量费用。您可以通过防盗链,设置Referer黑名单或白名单来限制访问来源。配置防盗链后,未授权的网站将无法显示您的OSS文件,同时失败的请求也不会产生请求费用和下行流量费用。
使用OSS托管静态网站
如果您使用OSS作为静态网站的服务器,直接存储和提供静态文件(如HTML、CSS、JavaScript等),以便用户通过互联网访问这些内容,除了绑定自定义域名外,您还需要为Bucket设置静态网站托管。
提升OSS文件在不同地域的下载速度
OSS Bucket 中的文件存储在某个地域(例如杭州)。为了提高不同地域用户下载 OSS 文件的速度,您可以使用CDN加速OSS。开启CDN加速后,OSS 文件会分发到各个地域的 CDN 缓存节点。用户在访问文件时,可以从离他们更近的缓存节点获取内容,从而有效提升下载速度。
在使用 CDN 加速 OSS 的情况下,建议将 CDN 域名用于文件下载,而对于文件上传,您可以继续使用原有的 Bucket 默认域名。
提升OSS文件的远距离传输速度
OSS Bucket 中的文件存储在某个地域(例如杭州)。非中国内地的用户访问时,可能因传输距离较远导致上传和下载体验非常差。为提升 OSS 文件的远距离传输速度,您可以开启传输加速,将自定义域名绑定到 OSS 的传输加速域名,而不是Bucket默认域名。