绑定自定义域名至Bucket默认域名

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

出于安全考虑,当您通过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管理控制台显示。

  • 绑定的自定义域名中涉及的顶级域名必须满足指定后缀的要求,否则会被视为无效域名,最终导致域名绑定失败。更多信息,请参见顶级域名分类解析

前提条件

  • 已创建Bucket。具体步骤,请参见创建存储空间

  • 已注册域名。支持绑定非阿里云注册的域名。如果您还未注册域名,您可以在阿里云域名服务平台注册域名。具体步骤,请参见注册域名

  • 如果要绑定的Bucket在中国内地,确保域名已备案,且账号已实名认证。如何备案和实名认证,请参见ICP备案流程个人实名认证企业实名认证

操作步骤

步骤一:绑定自定义域名

根据域名所属服务提供商(可在域名信息查询(WHOIS)页面查询)和所属账号(可在云解析DNS控制台查询),参考对应的步骤将域名绑定至OSS Bucket。

绑定当前阿里云账号注册的域名

将当前阿里云账号注册的域名,绑定至OSS Bucket的操作步骤如下:

  1. 登录OSS管理控制台

  2. 单击Bucket 列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择Bucket 配置>域名管理

  4. 域名管理页面,单击绑定域名

  5. 绑定域名面板,输入不带协议的自定义域名,例如static.example.com,然后单击确认绑定

    自定义域名示例

    场景

    域名示例

    描述

    静态网站托管

    example.com

    使用主域名,用户可以通过主域名访问托管在 OSS 上的完整网站内容。

    静态资源服务

    static.example.com

    使用子域名,用于集中管理和提供网站的静态资源(如图片、样式表和脚本等)。

    图片服务

    images.example.com

    使用子域名,为网站或移动应用提供图片资源。

    视频存储和播放

    video.example.com

    使用子域名,以存储和快速访问视频内容。

    文件共享和下载

    downloads.example.com

    使用子域名,提供便捷的文件下载服务。

    备份和日志存储

    backup.example.com

    使用子域名,用于存储备份数据或日志文件,简化数据管理流程。

    API 文档托管

    docs.example.com

    使用子域名,用于展示 API 文档,方便开发者进行访问。

  6. 添加CNAME记录,将自定义域名static.example.com解析至被绑定的Bucket的默认外网域名。

    自动添加

    开启自动添加 CNAME 记录

    1.png

    开启后,OSS会在云解析DNS自动添加一条CNAME记录。示例如下:1.png

    手动添加

    如果没有开启自动添加 CNAME 记录,您需要在云解析DNS控制台手动添加一条CNAME记录,否则绑定的自定义域名不会生效。

    1. 登录云解析DNS控制台

    2. 公网DNS解析 > 权威域名解析,单击目标域名右侧的解析设置

    3. 单击添加记录,填写域名解析信息。

      参数

      说明

      示例值

      记录类型

      选择CNAME记录将域名解析指向另一个域名

      CNAME

      主机记录

      填写要绑定的域名的前缀。

      static

      解析请求来源

      解析域名时使用的线路。 建议选择默认,系统将自动选择最佳线路。

      默认

      记录值

      填写Bucket的外网访问域名。Bucket域名的结构为<bucketname>.<endpoint>。关于不同地域的外网Endpoint,请参见OSS地域和访问域名

      examplebucket.oss-cn-hangzhou.aliyuncs.com

      TTL

      域名的更新周期,保留默认值即可。

      说明

      生效TTL的时间有一定的延迟,请以实际为准。

      10分钟

    4. 单击确定

      完成后,云解析DNS会出现一条CNAME记录。示例如下:1.png

绑定其他阿里云账号注册的域名

将阿里云A账号注册的域名,绑定至阿里云B账号的OSS Bucket的操作步骤如下:

  1. 使用阿里云B账号,获取TXT记录的主机记录和记录值。

    1. 登录OSS管理控制台

    2. 单击Bucket 列表,然后单击目标Bucket名称。

    3. 在左侧导航栏,选择Bucket 配置>域名管理

    4. 域名管理页面,单击绑定域名

    5. 绑定域名面板,输入不带协议的要绑定的阿里云A账号的自定义域名,例如static.example.com,然后复制页面显示的主机记录记录值

      自定义域名示例

      场景

      域名示例

      描述

      静态网站托管

      example.com

      使用主域名,用户可以通过主域名访问托管在 OSS 上的完整网站内容。

      静态资源服务

      static.example.com

      使用子域名,用于集中管理和提供网站的静态资源(如图片、样式表和脚本等)。

      图片服务

      images.example.com

      使用子域名,为网站或移动应用提供图片资源。

      视频存储和播放

      video.example.com

      使用子域名,以存储和快速访问视频内容。

      文件共享和下载

      downloads.example.com

      使用子域名,提供便捷的文件下载服务。

      备份和日志存储

      backup.example.com

      使用子域名,用于存储备份数据或日志文件,简化数据管理流程。

      API 文档托管

      docs.example.com

      使用子域名,用于展示 API 文档,方便开发者进行访问。

  2. 使用阿里云A账号,添加TXT记录。

    1. 登录云解析DNS控制台

    2. 在域名解析列表中,单击目标域名右侧的解析设置

    3. 单击添加记录,填写域名解析信息。

      参数

      说明

      示例值

      记录类型

      选择域名指向的类型为TXT。

      TXT

      主机记录

      阿里云云解析DNS已自动帮你填写了主域名。因此,填写时,不需要手动填写主域名部分。

      • 如果绑定的是主域名,填写_dnsauth。例如域名为example.com,填写_dnsauth

      • 如果绑定的是子域名,填写_dnsauth.<域名前缀>。例如域名为static.example.com,填写_dnsauth.static

      _dnsauth.static

      解析请求来源

      解析域名时使用的线路。 建议选择默认,系统将自动选择最佳线路。

      默认

      记录值

      填写使用阿里云B账号获取的TXT记录中的CnameToken。

      b0d777f7ccddeae93358d908ed59****

      TTL

      域名的更新周期,保留默认值即可。

      说明

      生效TTL的时间有一定的延迟,请以实际为准。

      10分钟

    4. 单击确定

  3. 使用阿里云B账号,在OSS控制台的绑定域名面板,单击验证域名所有权并绑定

  4. 使用阿里云A账号,添加CNAME记录。

    1. 在域名解析列表中,单击目标域名右侧的解析设置

    2. 单击添加记录,填写域名解析信息。

      参数

      说明

      示例值

      记录类型

      选择域名指向的类型为CNAME。

      CNAME

      主机记录

      根据域名前缀填写主机记录。

      • 如果是主域名,例如example.com,输入@

      • 如果是子域名,输入域名的前缀。例如域名为static.example.com,输入static。

      static

      解析请求来源

      解析域名时使用的线路。 建议选择默认,系统将自动选择最佳线路。

      默认

      记录值

      填写Bucket的外网访问域名。Bucket域名的结构为<bucketname>.<endpoint>。关于不同地域的外网Endpoint,请参见OSS地域和访问域名

      examplebucket.oss-cn-hangzhou.aliyuncs.com

      TTL

      域名的更新周期,保留默认值即可。

      说明

      生效TTL的时间有一定的延迟,请以实际为准。

      10分钟

    3. 单击确定

绑定非阿里云账号注册的域名

将在其他域名服务提供商注册的域名,绑定至OSS Bucket的操作步骤如下:

  1. 在阿里云OSS,生成TXT记录的主机记录和记录值。

    1. 登录OSS管理控制台

    2. 单击Bucket 列表,然后单击目标Bucket名称。

    3. 在左侧导航栏,选择Bucket 配置>域名管理

    4. 域名管理页面,单击绑定域名

    5. 绑定域名面板,输入不带协议的在其他域名服务提供商注册的域名,例如static.example.com,然后复制页面显示的主机记录记录值

      自定义域名示例

      场景

      域名示例

      描述

      静态网站托管

      example.com

      使用主域名,用户可以通过主域名访问托管在 OSS 上的完整网站内容。

      静态资源服务

      static.example.com

      使用子域名,用于集中管理和提供网站的静态资源(如图片、样式表和脚本等)。

      图片服务

      images.example.com

      使用子域名,为网站或移动应用提供图片资源。

      视频存储和播放

      video.example.com

      使用子域名,以存储和快速访问视频内容。

      文件共享和下载

      downloads.example.com

      使用子域名,提供便捷的文件下载服务。

      备份和日志存储

      backup.example.com

      使用子域名,用于存储备份数据或日志文件,简化数据管理流程。

      API 文档托管

      docs.example.com

      使用子域名,用于展示 API 文档,方便开发者进行访问。

  2. 在域名服务提供商的DNS解析平台,参考下表添加TXT记录。

    参数

    说明

    示例值

    记录类型

    选择域名指向的类型为TXT。

    TXT

    主机记录

    如果其他域名服务提供商的DNS解析平台已自动帮你填写了主域名,填写时,不需要手动填写主域名部分。

    • 如果绑定的是主域名,填写_dnsauth。例如域名为example.com,填写_dnsauth

    • 如果绑定的是子域名,填写_dnsauth.<域名前缀>。例如域名为static.example.com,填写_dnsauth.static

    _dnsauth.static

    记录值

    填写从阿里云OSS获取的TXT记录中的CnameToken。

    b0d777f7ccddeae93358d908ed59****

  3. 在阿里云OSS控制台的绑定域名面板,单击验证域名所有权并绑定

  4. 在域名服务提供商的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 默认域名。您可以使用nslookupdig命令来验证自定义域名解析是否生效。

nslookup

static.example.com替换为您要查询的域名,然后执行以下命令。

nslookup -type=CNAME static.example.com

域名解析结果显示绑定的Bucket的外网访问域名,说明自定义域名解析已生效。

1.png

dig

static.example.com替换为您要查询的域名,然后执行以下命令。

dig CNAME static.example.com

域名解析结果显示绑定的Bucket的外网访问域名,说明自定义域名解析已生效。

2.png

步骤三:使用自定义域名

自定义域名解析生效后,您可以使用HTTP协议和自定义域名构造包含签名和有效期的URL,URL的格式为http://YourDomain/ObjectName?签名参数,然后使用该URL访问OSS文件。

  1. 获取签名URL。

    使用OSS控制台

    1. 登录OSS管理控制台

    2. 单击Bucket列表,然后单击目标Bucket名称。

    3. 在左侧导航栏,选择文件管理 > 文件列表

    4. 在文件列表页面,单击目标文件名称。

    5. 详情面板的自有域名,选择绑定的自定义域名,其他保持默认值,然后单击复制文件URL

      2.png

    使用图形化管理工具ossbrowser

    ossbrowser支持Object级别的操作与控制台支持的操作类似,请按照ossbrowser界面指引完成获取签名URL的操作。如何下载ossbrowser,请参见图形化管理工具ossbrowser 2.0(预览版)

    1. 使用自定义域名登录ossbrowser。

      ossbrowser domain

    1. 获取文件URL。

      1.png

    使用阿里云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_IDOSS_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_safeTrue,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_IDOSS_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_IDOSS_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(&region, "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命令自动使用自定义域名,而无需每次在命令中手动指定自定义域名,您可以在配置文件中添加自定义域名,

  2. 在浏览器中访问签名URL。

    2023-11-07_11-01-40.png

相关API

  • 关于创建域名所有权验证所需的CnameToken的接口,请参见CreateCnameToken

  • 关于获取已创建的CnameToken的接口,请参见GetCnameToken

  • 关于为某个Bucket绑定自定义域名的接口,请参见PutCname

  • 关于查询某个Bucket下绑定的所有自定义域名的接口,请参见ListCname

  • 关于删除某个Bucket已绑定的自定义域名的接口,请参见DeleteCname

  • 关于使用阿里云解析DNS添加TXT解析记录或CNAME解析记录的接口,请参见AddDomainRecord - 根据传入参数添加解析记录

后续操作

通过HTTPS协议访问OSS文件

自定义域名在未配置SSL证书的情况下,默认不支持HTTPS协议访问。通过HTTPS协议访问自定义域名时,浏览器会显示不安全连接警告。为了通过HTTPS协议访问OSS文件,需要为自定义域名配置证书

httpsandpresigned

使用不带签名的URL访问OSS文件

警告

如需获取不存在签名和过期时间的URL,即URL的格式为http://YourDomainName/ObjectName,您需要将文件设置为公共读。设置为公共读后,互联网上任何用户都可以访问该文件,这有可能造成您数据的外泄以及费用激增,建议您使用包含签名和过期时间的URL。

您可以通过以下两种方式将文件设置为公共读:

  • 设置文件为公共读:将 OSS 文件的权限设置为公共读。在这种情况下,文件的 URL 将没有有效期,任何人都可以访问。为了防止文件被其他网站盗用,您需要在 OSS 中配置防盗链

  • CDN加速OSS资源:保持 OSS 文件的权限为私有,通过 CDN 提供公共读访问。在这种情况下,文件的 URL 将没有有效期,任何人都可以访问。为了防止文件被其他网站盗用,您需要在 CDN 配置防盗链

https

防止OSS文件被其他网站盗用

默认情况下,任何网站都可以显示您的OSS文件,这可能导致额外的请求费用和下行流量费用。您可以通过防盗链,设置Referer黑名单或白名单来限制访问来源。配置防盗链后,未授权的网站将无法显示您的OSS文件,同时失败的请求也不会产生请求费用和下行流量费用。

防盗链

使用OSS托管静态网站

如果您使用OSS作为静态网站的服务器,直接存储和提供静态文件(如HTML、CSS、JavaScript等),以便用户通过互联网访问这些内容,除了绑定自定义域名外,您还需要为Bucket设置静态网站托管

1

提升OSS文件在不同地域的下载速度

OSS Bucket 中的文件存储在某个地域(例如杭州)。为了提高不同地域用户下载 OSS 文件的速度,您可以使用CDN加速OSS。开启CDN加速后,OSS 文件会分发到各个地域的 CDN 缓存节点。用户在访问文件时,可以从离他们更近的缓存节点获取内容,从而有效提升下载速度。

说明

在使用 CDN 加速 OSS 的情况下,建议将 CDN 域名用于文件下载,而对于文件上传,您可以继续使用原有的 Bucket 默认域名。

image

提升OSS文件的远距离传输速度

OSS Bucket 中的文件存储在某个地域(例如杭州)。非中国内地的用户访问时,可能因传输距离较远导致上传和下载体验非常差。为提升 OSS 文件的远距离传输速度,您可以开启传输加速,将自定义域名绑定到 OSS 的传输加速域名,而不是Bucket默认域名。

1

常见问题

设置了Content-Disposition: inline,无法预览

出于数据传输安全考虑,使用OSS提供的Bucket默认域名(<bucketName>.oss-<regionId>.aliyuncs.com)或传输加速域名(<bucketName>.oss-accelerate.aliyuncs.com)访问Bucket的文件(网页、图片)时,即使您设置了Content-Disposition: inline,OSS还是会在返回中强制增加下载响应头(x-oss-force-download: trueContent-Disposition: attachment)。浏览器检测到Content-Disposition: attachment时,会触发强制下载行为。

2.png

您可以在已注册的域名(例如example.com)上自定义一个子域名(例如static.example.com),并将其绑定至Bucket,然后使用自定义域名访问文件。此时,OSS不会在返回中强制增加下载响应头。由于OSS没有设置Content-Disposition字段,浏览器会默认将其设置为inline。浏览器会直接显示文件内容,而不是下载文件。

1.png

不支持选择OSS作为备案的云服务怎么办?

对于直接使用阿里云OSS托管静态网站的用户,由于OSS服务不支持备案,您可以采取以下步骤来满足备案要求:

  1. 购买用于备案服务器:建议您购买一台最低配置、时长至少3个月的ECS实例,例如ECS 99套餐,以满足备案条件。

  2. 进行备案:使用该ECS实例进行相应的备案操作。

  3. 使用备案后的域名:备案成功后,您可以将域名指向阿里云OSS,实现静态网站的托管。

已有主机记录与当前添加CNAME记录生成的主机记录相同,暂时无法自动添加CNAME记录

原因

当已有主机记录与当前自动添加的CNAME记录相同时,可能有以下几种情况:

  • 冲突记录:已存在一个使用相同主机记录的记录,但记录类型可能与CNAME不同。例如,可能已经存在一个A记录。

  • 重复记录:已存在一个使用相同主机记录的记录,且记录类型为CNAME记录。这可能是因为先前已手动添加了相同的记录。

解决方案

在这种情况下,您可以在阿里云云解析DNS控制台根据您的需求来决定如何处理:

  • 如果您希望保留已有的冲突或重复主机记录,您可以重新自定义一个子域名进行绑定。

  • 如果您不希望保留已有的主机记录:

    • 如果是冲突记录,您可以删除该记录,然后创建CNAME记录解析至Bucket域名。

    • 如果是重复记录,您可以修改记录,将其解析至Bucket域名。

域名绑定在其他Bucket上怎么办?

您需要解除Bucket绑定的域名,然后重新绑定到当前Bucket上。您可以参考以下步骤解绑自定义域名。

  1. 如果开启了CDN加速,需要先关闭CDN加速。

    您需要修改CDN加速服务的源站信息,使加速域名不再指向OSSBucket域名。具体操作,请参见配置源站

  2. 解绑自定义域名。

    1. 登录OSS管理控制台

    2. 单击Bucket 列表,然后单击目标Bucket名称。

    3. 在左侧导航栏,选择Bucket配置>域名管理

    4. 在域名列表中,单击目标域名右侧的域名绑定配置

    5. 域名绑定配置面板,单击解除绑定然后单击确定

  3. 删除域名解析。

    解绑自定义域名后,您需要手动删除配置的TXT解析记录和CNAME解析记录。具体操作,请参见删除记录

NeedVerifyDomainOwnership

你需要验证域名所有权。具体操作,请参见绑定自定义域名时返回错误码NeedVerifyDomainOwnership,怎么办?

绑定自定义域名后,还是无法预览文件?

如果绑定自定义域名并且CNAME解析生效后,仍然无法预览文件,请排查以下设置:

设置

异常原因

解决方法

OSS

Content-Type的值与实际的文件类型不一致。浏览器无法正确解析和渲染该文件,而只能将其作为下载文件处理。

根据文件类型,设置合理的Content-Type。具体操作,请参见如何设置Content-Type(MIME)?

Content-Disposition被设置为attachment。浏览器检测到Content-Disposition: attachment时,会触发下载行为。

Content-Disposition设置为inline。具体步骤,请参见管理文件元数据

CDN

缓存资源未刷新。

刷新CDN缓存资源。具体步骤,请参见刷新和预热资源

浏览器

不支持预览该格式的文件,例如.doc、.ppt、.mov文件。

  • 为浏览器安装插件以支持预览该格式的文件。

  • 对于.doc、.ppt等文件,使用文档在线预览

  • 对于.mov等视频文件,进行视频转码后预览。

已经正常解析到WAF且有内容的域名可以绑定至Bucket吗?

可以正常绑定。WAF解析和CNAME解析不会发生冲突,因为它们在不同的层面上进行解析和操作。如何将WAF接入OSS,请参见CDN回源OSS私有Bucket场景下串接WAF最佳实践

绑定自定义域名后,之前的文件URL是否可以继续使用?

可以继续使用。如何获取之前的文件URL,请参见使用文件URL分享文件

使用自定义域名就是公网访问吗?

一般是通过公网访问。公网用户通常需要以预览的方式访问您的OSS文件,因此自定义域名默认解析到Bucket的外网访问域名。

如何使用自定义域名访问OSS文件时是下载行为?

如需实现使用自定义域名访问OSS文件时是下载行为,您可以将Content-Disposition设置为attachment。具体操作,请参见如何配置通过自定义域名访问OSS文件实现强制下载?

配置了域名解析,没有生效?

可能是本地DNS缓存导致,您可以使用以下命令清除DNS缓存,然后尝试访问。

Window

 ipconfig /flushdns

macOS

 sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Linux

 sudo systemd-resolve --flush-caches