全部產品
Search
文件中心

Object Storage Service:綁定自訂網域名至Bucket預設網域名稱

更新時間:Dec 13, 2024

檔案上傳到OSS後,OSS會使用Bucket的預設網域名稱組建檔案訪問地址。當您在瀏覽器中通過預設網域名稱訪問檔案時,會觸發強制下載行為。如果您希望在瀏覽器中預覽檔案,則需要為Bucket綁定自訂網域名,並通過自訂網域名訪問Bucket中的檔案。對於綁定自訂網域名不會影響您對預設網域名稱的使用,您仍然可以繼續使用OSS提供的預設網域名稱。

前提條件

  • 已建立Bucket。具體步驟,請參見建立儲存空間

  • 註冊網域名。支援綁定非阿里雲註冊的網域名稱。如果您還未註冊網域名稱,您可以在阿里雲網域名稱服務 (DNS)平台註冊網域名稱。具體步驟,請參見註冊網域名稱

  • 如果要綁定的Bucket在中國內地,確保網域名稱已備案,且帳號已實名認證。如何備案和實名認證,請參見ICP備案流程阿里雲帳號實名登記常見問題

使用情境

  • 檔案預覽:通過自訂網域名訪問OSS Bucket,避免OSS強制增加下載回應標頭,實現在瀏覽器中預覽檔案。

  • 訪問.apk或者.ipa的檔案:出於安全考慮,通過OSS預設公網網域名稱訪問2023年08月15日後建立的Bucket中尾碼為.apk或者.ipa的檔案,伺服器返回400錯誤。使用自有網域名稱訪問尾碼為.apk或者.ipa的檔案時將不會被阻斷。

  • 品牌形象和專業性:將自訂網域名綁定到OSS Bucket,提供個人化網域名稱,增強品牌形象和專業性,增加使用者信任度。

  • 防止網域名稱被攔截:一些應用或平台可能會對Bucket預設網域名稱進行攔截。您可以為Bucket綁定自訂網域名,以確保您的OSS Bucket中的資源能夠被正常訪問。

  • 訪問方便性:使用自訂網域名訪問OSS Bucket,方便易記,相比使用OSS預設網域名稱,更簡潔友好,輕鬆訪問和分享資源。

  • 使用者體驗最佳化:通過自訂網域名,提高訪問速度,結合CDN加速技術,實現快速內容分發和下載,減少延遲,提升使用者體驗。

  • 連結的持久性:綁定自訂網域名到OSS Bucket後,即使後續儲存位置或服務有變化,使用者仍可使用相同網域名稱訪問資源,確保連結的持久性,長期可訪問和使用儲存資源。

背景資訊

訪問Bucket預設網域名稱或傳輸加速網域名稱會預設下載檔案,而訪問自訂網域名會預設預覽檔案的原因如下:

訪問Bucket預設網域名稱或傳輸加速網域名稱

出於資料轉送安全考慮,使用OSS提供的Bucket預設網域名稱(<bucketName>.oss-<regionId>.aliyuncs.com)或傳輸加速網域名稱(<bucketName>.oss-accelerate.aliyuncs.com)訪問Bucket的檔案(網頁、圖片)時,OSS會在返回中強制增加下載回應標頭(x-oss-force-download: trueContent-Disposition: attachment)。瀏覽器檢測到Content-Disposition: attachment時,會觸發強制下載行為。使用OSS提供的網域名稱訪問檔案時,觸發下載行為的請求流程如下:

2.png

關於使用OSS的預設Bucket網域名稱或傳輸加速網域名稱訪問檔案,觸發自動下載的生效時間和生效對象,請參見附錄:強制下載命中的x-oss-ec規則

訪問自訂網域名

您可以在登入的網域名稱(例如example.com)上自訂一個子網域名稱(例如static.example.com),並將其綁定至Bucket,然後使用自訂網域名訪問檔案。此時,OSS不會在返回中強制增加下載回應標頭。由於OSS沒有設定Content-Disposition欄位,瀏覽器會預設將其設定為inline。瀏覽器會直接顯示檔案內容,而不是下載檔案。使用自訂網域名訪問檔案,預設預覽行為的請求流程如下:

1.png

使用限制

  • 不支援綁定中文網域名稱。

  • 每個網域名稱只能綁定至一個Bucket。

  • 每個Bucket最多可以綁定100個網域名稱。

  • 通過OSS管理主控台綁定自訂網域名時,不允許綁定泛網域名稱(將網域名稱首碼設定為*,從而將主網域名稱的所有子網域名稱都指向Bucket預設網域名稱)。通過CDN加速OSS時,允許綁定泛網域名稱,但該網域名稱不會在OSS管理主控台顯示。

操作步驟

步驟一:綁定自訂網域名

根據網域名稱所屬服務提供者和所屬帳號,參考對應的步驟將網域名稱綁定至OSS Bucket。

說明

綁定當前阿里雲帳號註冊的網域名稱

將當前阿里雲帳號註冊的網域名稱,綁定至OSS Bucket的操作步驟如下:

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇Bucket 配置>網域名稱管理

  4. 網域名稱管理頁面,單擊綁定域名

  5. 綁定域名面板,輸入要綁定的網域名稱,例如static.example.com,然後單擊確認綁定

  6. 添加CNAME記錄,將自訂網域名static.example.com解析至被綁定的Bucket的預設外網網域名稱。

    自動添加

    開啟自動添加 CNAME 記錄

    1.png

    開啟後,OSS會在Alibaba Cloud DNS自動添加一條CNAME記錄。樣本如下:1.png

    手動添加

    如果沒有開啟自動添加 CNAME 記錄,您需要在Alibaba Cloud DNS控制台手動添加一條CNAME記錄,否則綁定的自訂網域名不會生效。

    1. 登入Alibaba Cloud DNS控制台

    2. 公網DNS解析 > 權威網域名稱解析,單擊目標網域名稱右側的解析設定

    3. 單擊添加記錄,填寫網域名稱解析資訊。

      參數

      說明

      樣本值

      記錄類型

      選擇CNAME記錄將網域名稱解析指向另一個網域名稱

      CNAME

      主機記錄

      填寫要綁定的網域名稱的首碼。

      static

      解析請求來源

      解析網域名稱時使用的線路。 建議選擇預設,系統將自動選擇最佳線路。

      預設

      記錄值

      填寫Bucket的外網訪問網域名稱。Bucket網域名稱的結構為<bucketname>.<endpoint>。關於不同地區的外網Endpoint,請參見OSS地區和訪問網域名稱

      examplebucket.oss-cn-hangzhou.aliyuncs.com

      TTL

      網域名稱的更新周期,保留預設值即可。

      說明

      生效TTL的時間有一定的延遲,請以實際為準。

      10分鐘

    4. 單擊確定

      完成後,Alibaba Cloud DNS會出現一條CNAME記錄。樣本如下:1.png

綁定其他阿里雲帳號註冊的網域名稱

將阿里雲A帳號註冊的網域名稱,綁定至阿里雲B帳號的OSS Bucket的操作步驟如下:

  1. 使用阿里雲B帳號,擷取TXT記錄的主機記錄和記錄值。

    1. 登入OSS管理主控台

    2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

    3. 在左側導覽列,選擇Bucket 配置>網域名稱管理

    4. 網域名稱管理頁面,單擊綁定域名

    5. 綁定域名面板,輸入要綁定的阿里雲A帳號的自訂網域名,例如static.example.com,然後複製頁面顯示的主機記錄記錄值

  2. 使用阿里雲A帳號,添加TXT記錄。

    1. 登入Alibaba Cloud DNS控制台

    2. 在網域名稱解析列表中,單擊目標網域名稱右側的解析設定

    3. 單擊添加記錄,填寫網域名稱解析資訊。

      參數

      說明

      樣本值

      記錄類型

      選擇網域名稱指向的類型為TXT。

      TXT

      主機記錄

      阿里雲Alibaba Cloud 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. 單擊確定

綁定非阿里雲帳號註冊的網域名稱

將在其他網域名稱服務 (DNS)供應商註冊的網域名稱,綁定至OSS Bucket的操作步驟如下:

  1. 在阿里雲OSS,產生TXT記錄的主機記錄和記錄值。

    1. 登入OSS管理主控台

    2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

    3. 在左側導覽列,選擇Bucket 配置>網域名稱管理

    4. 網域名稱管理頁面,單擊綁定域名

    5. 綁定域名面板,輸入在其他網域名稱服務 (DNS)供應商註冊的網域名稱,例如static.example.com,然後複製頁面顯示的主機記錄記錄值

  2. 在網域名稱服務 (DNS)供應商的DNS解析平台,參考下表添加TXT記錄。

    參數

    說明

    樣本值

    記錄類型

    選擇網域名稱指向的類型為TXT。

    TXT

    主機記錄

    如果其他網域名稱服務 (DNS)供應商的DNS解析平台已自動幫你填寫了主網域名稱,填寫時,不需要手動填寫主網域名稱部分。

    • 如果綁定的是主網域名稱,填寫_dnsauth。例如網域名稱為example.com,填寫_dnsauth

    • 如果綁定的是子網域名稱,填寫_dnsauth.<網域名稱首碼>。例如網域名稱為static.example.com,填寫_dnsauth.static

    _dnsauth.static

    記錄值

    填寫從阿里雲OSS擷取的TXT記錄中的CnameToken。

    b0d777f7ccddeae93358d908ed59****

  3. 在阿里雲OSS控制台的綁定域名面板,單擊驗證網域名稱所有權並綁定

  4. 在網域名稱服務 (DNS)供應商的DNS解析平台,參考下表添加CNAME記錄。

    參數

    說明

    樣本值

    記錄類型

    選擇網域名稱指向的類型為CNAME。

    CNAME

    主機記錄

    根據網域名稱首碼填寫主機記錄。

    • 如果是主網域名稱,例如example.com,輸入@

    • 如果是子網域名稱,輸入欄位名首碼。例如網域名稱為static.example.com,輸入static。

    static

    記錄值

    填寫Bucket的外網訪問網域名稱。Bucket網域名稱的結構為<bucketname>.<endpoint>。關於不同地區的外網Endpoint,請參見OSS地區和訪問網域名稱

    examplebucket.oss-cn-hangzhou.aliyuncs.com

步驟二:驗證自訂網域名

綁定自訂網域名後,您可以使用nslookupdig命令來驗證自訂網域名解析是否生效。如果網域名稱解析結果顯示為您綁定的Bucket的外網訪問網域名稱,則說明自訂網域名的CNAME解析已生效。

nslookup

static.example.com替換為您要查詢的網域名稱,然後執行以下命令。

nslookup -type=CNAME static.example.com

成功返回樣本如下。

1.png

dig

static.example.com替換為您要查詢的網域名稱,然後執行以下命令。

dig CNAME static.example.com

成功返回樣本如下。

2.png

步驟三:使用自訂網域名

自訂網域名生效後,您可以直接通過HTTP協議訪問檔案。

重要

HTTP協議無法確保資料在傳輸過程中的安全性,即資料可能存在被第三方截取或篡改的風險。考慮到資料安全的重要性,強烈推薦您採用HTTPS協議進行訪問。具體操作,請參見使用HTTPS協議

  1. 上傳檔案。

    具體操作,請參見簡單上傳

  2. 擷取檔案URL。

    臨時檔案URL

    擷取臨時有效檔案URL的操作步驟如下:

    1. 設定檔案讀寫權限ACL為私人。

      具體操作,請參見設定Object ACL

    2. 私人檔案URL的格式為http://YourDomain/ObjectName?簽名參數。您可以通過以下方法擷取檔案URL並設定URL的有效時間長度。

    使用OSS控制台

    1. 登入OSS管理主控台

    2. 單擊Bucket列表,然後單擊目標Bucket名稱。

    3. 在左側導覽列,選擇文件管理 > 檔案清單

    4. 在檔案清單頁面,單擊目標檔案名稱。

    5. 詳情面板的自有網域名稱,選擇綁定的自訂網域名,其他保持預設值,然後單擊複製檔案URL

      2.png

    使用圖形化管理工具ossbrowser

    ossbrowser支援Object層級的操作與控制台支援的操作類似,請按照ossbrowser介面指引完成擷取簽名URL的操作。

    如何下載並使用ossbrowser,請參見圖形化管理工具ossbrowser 2.0(預覽版)

    使用阿里雲SDK

    1. 使用自訂網域名建立OssClient。

    2. Java

      // yourEndpoint填寫自訂網域名。
      String endpoint = "yourEndpoint";
      
      // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請先配置環境變數。
      EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
      
      // 建立ClientBuilderConfiguration執行個體,您可以根據實際情況修改預設參數。
      ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
      
      // 設定是否支援CNAME。CNAME用於將自訂網域名綁定到目標Bucket。
      conf.setSupportCname(true);
      
      // 建立OSSClient執行個體。
      OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider, conf);
      
      // 關閉OSSClient。
      ossClient.shutdown();                    

      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\Credentials\EnvironmentVariableCredentialsProvider;
      use OSS\OssClient;
      use OSS\CoreOssException;
      
      // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 
      $provider = new EnvironmentVariableCredentialsProvider();
      // 填寫自訂網域名,例如http://example.com。
      $endpoint = "http://example.com";
      
      try {
          $config = array(
              "provider" => $provider,
              "endpoint" => $endpoint,
              "cname"	=> true
          );
          $ossClient = new OssClient($config);    
      } catch (OssException $e) {
          print $e->getMessage();
      }    
                      

      Node.js

      const OSS = require('ali-oss')
      
      const client = new OSS({
        // 使用自訂網域名作為Endpoint。
        endpoint: 'http://img.example.com', 
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        accessKeyId: process.env.OSS_ACCESS_KEY_ID,
        accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
        authorizationV4: true,
        // yourRegion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
        region: 'yourRegion',
        cname: true
      });

      Python

      # -*- coding: utf-8 -*-
      import oss2
      from oss2.credentials import EnvironmentVariableCredentialsProvider
      
      # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請先配置環境變數。
      auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
      
      # 填寫自訂網域名,例如example.com。
      cname = 'http://example.com'
      
      # 填寫Bucket名稱,並設定is_cname=True來開啟CNAME。CNAME是指將自訂網域名綁定到儲存空間。
      bucket = oss2.Bucket(auth, cname, 'examplebucket', is_cname=True)   

      Browser.js

      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="UTF-8" />
          <meta name="viewport" content="width=device-width, initial-scale=1.0" />
          <title>Document</title>
          <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
        </head>
        <body>
          <script>
            const client = new OSS({
              // 填寫自訂網域名,例如example.com。
              // yourRegion填寫Bucket所在地區。以華東1(杭州)為例,yourRegion填寫為oss-cn-hangzhou。
              region: 'yourRegion',
              endpoint: "example.com",
              authorizationV4: true,
              // 從STS服務擷取的臨時存取金鑰(AccessKey ID和AccessKey Secret)。
              accessKeyId: "yourAccessKeyId",
              accessKeySecret: "yourAccessKeySecret",
              // 從STS服務擷取的安全性權杖(SecurityToken)。
              stsToken: 'yourSecurityToken',
              // 填寫Bucket名稱,例如examplebucket。
              bucket: "examplebucket",
              cname: true,
            });    
                
          </script>
        </body>
      </html>
      

      .NET

      using Aliyun.OSS;
      using Aliyun.OSS.Common;
      // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
      var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
      var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
      // 填寫自訂網域名。
      const string endpoint = "yourDomain";
      
      // 建立ClientConfiguration執行個體,按照您的需要修改預設參數。
      var conf = new ClientConfiguration();
      
      // 開啟CNAME開關。CNAME是指將自訂網域名綁定到儲存空間的過程。
      conf.IsCname = true;
      
      // 建立OssClient執行個體。
      var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);                    

      Android

      // yourEndpoint填寫自訂網域名。
      String endpoint = "yourEndpoint";
      // 從STS服務擷取的臨時存取金鑰(AccessKey ID和AccessKey Secret)。
      String accessKeyId = "yourAccessKeyId";
      String accessKeySecret = "yourAccessKeySecret";
      // 從STS服務擷取的安全性權杖(SecurityToken)。
      String securityToken = "yourSecurityToken";
      // yourEndpoint填寫Bucket所在地區。以華東1(杭州)為例,region填寫為cn-hangzhou。
      String region = "yourRegion";
      
      OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken);
      ClientConfiguration config = new ClientConfiguration();
      config.setSignVersion(SignVersion.V4);
      // 建立OSSClient執行個體。
      OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider);
      oss.setRegion(region);

      Go

      package main
      
      import (
      	"log"
      
      	"github.com/aliyun/aliyun-oss-go-sdk/oss"
      )
      
      // handleError 用於處理不可恢複的錯誤,並記錄錯誤資訊後終止程式。
      func handleError(err error) {
      	log.Fatalf("Error: %v", err)
      }
      
      // setupClient 用於設定並建立OSS用戶端執行個體,支援CNAME。
      // 參數:
      //
      //	endpoint - 自訂網域名,即綁定到儲存空間的自訂網域名。
      //
      // 返回建立的OSS用戶端執行個體。
      func setupClient(endpoint string) (*oss.Client, error) {
      	// 從環境變數中擷取訪問憑證。
      	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
      	if err != nil {
      		return nil, err
      	}
      
      	// 建立OSSClient執行個體,並啟用CNAME支援。
      	// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
      	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
      	clientOptions = append(clientOptions, oss.Region("yourRegion"))
      	clientOptions = append(clientOptions, oss.UseCname(true))
      	// 設定簽名版本
      	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
      	client, err := oss.New(endpoint, "", "", clientOptions...)
      	if err != nil {
      		return nil, err
      	}
      
      	return client, nil
      }
      
      func main() {
      	// yourEndpoint填寫Bucket對應的自訂網域名。
      	// 樣本:填寫為 "custom-domain-for-your-bucket.com"。
      	endpoint := "yourEndpoint"
      
      	// 檢查環境變數是否已經設定。
      	if endpoint == "" {
      		log.Fatal("Please set yourEndpoint.")
      	}
      
      	// 設定並建立OSS用戶端執行個體,支援CNAME。
      	client, err := setupClient(endpoint)
      	if err != nil {
      		handleError(err)
      	}
      
      	// 輸出用戶端資訊。
      	log.Printf("Client: %#v\n", client)
      }
      

      iOS

      // yourEndpoint填寫自訂網域名。
      NSString *endpoint = @"yourEndpoint";
      // 從STS服務擷取的臨時存取金鑰(AccessKey ID和AccessKey Secret)。
      NSString *accessKeyId = @"yourAccessKeyId";
      NSString *accessKeySecret = @"yourAccessKeySecret";
      // 從STS服務擷取的安全性權杖(SecurityToken)。
      NSString *securityToken = @"yourSecurityToken";
      
      id<OSSCredentialProvider> credentialProvider = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:accessKeyId secretKeyId:accessKeySecret securityToken:securityToken];
      OSSClient *client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credentialProvider];

      C++

      #include <alibabacloud/oss/OssClient.h>
      using namespace AlibabaCloud::OSS;
      
      int main(void)
      {
          /* 初始化OSS帳號資訊。*/
                  
          /* yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
          std::string Endpoint = "yourEndpoint";
          
          /* 初始化網路等資源。*/
          InitializeSdk();
      
          ClientConfiguration conf;
          /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
          auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
          OssClient client(Endpoint, credentialsProvider, conf);   
      
          /* 釋放網路等資源。*/
          ShutdownSdk();
          return 0;
      }

      C

      #include "oss_api.h"
      #include "aos_http_io.h"
      /* 填寫自訂網域名。*/
      const char *endpoint = "yourCustomEndpoint";
      
      void init_options(oss_request_options_t *options) {
          options->config = oss_config_create(options->pool);
          /* 用char*類型的字串初始化aos_string_t類型。*/
          aos_str_set(&options->config->endpoint, endpoint);
          /* 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/  
          aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
          aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
          /* 開啟CNAME,將自訂網域名綁定到儲存空間上。*/
          options->config->is_cname = 1;
          options->ctl = aos_http_controller_create(options->pool, 0);
      }
      int main() {
          aos_pool_t *p;
          oss_request_options_t *options;
          /* 初始化全域變數,在程式生命週期內只需要調用一次。*/
          if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
              return -1;
          }
          /* 初始化記憶體池和options。*/
          aos_pool_create(&p, NULL);
          options = oss_request_options_create(p);
          init_options(options);
          /* 邏輯代碼,此處省略。*/
          /* 釋放記憶體池,相當於釋放了請求過程中各資源分派的記憶體。*/
          aos_pool_destroy(p);
          /* 釋放之前分配的全域資源,在程式生命週期內只需要調用一次。*/
          aos_http_io_deinitialize();
          return 0;
      }

      Ruby

      require 'aliyun/oss'
      
      client = Aliyun::OSS::Client.new(
        # 使用自訂網域名作為Endpoint。
        endpoint: 'http://example.com',
        # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        access_key_id: ENV['OSS_ACCESS_KEY_ID'],
        access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
        cname: true)
      )
    3. 使用OssClient調用generatePresignedUrl介面擷取簽名URL。

      各語言SDK樣本,請參見簽名版本1

    使用命令列工具ossutil

    1. 通過設定檔設定Bucket和自訂網域名的映射關係。詳情請參見配置ossutil

    2. 通過sign產生經過簽名的檔案URL。詳情請參見sign(產生簽名URL)

    長期檔案URL

    警告

    如需擷取長期有效檔案URL,即不存在到期時間。您需要將讀檔案讀寫權限ACL設定為公用讀取。設定為公用讀取後,檔案的互連網上任何使用者都可以對該Object進行訪問,這有可能造成您資料的外泄以及費用激增,建議您使用臨時檔案URL。

    擷取長期有效檔案URL的操作步驟如下:

    1. 設定檔案讀寫權限ACL為公用讀取。

      具體操作,請參見設定Object ACL

    2. 拼接檔案URL。

      綁定自訂網域名後,如果檔案讀寫權限ACL為公用讀取,則無需進行簽名操作。公用讀取檔案URL的格式為http://YourDomainName/ObjectName

      例如,您為華東1(杭州)地區的examplebucket綁定了自訂網域名static.example.com,且該Bucket下包含example.jpg的檔案,則該檔案URL為http://static.example.com/example.jpg

  3. 在瀏覽器中,訪問產生的檔案URL。

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

後續操作

使用HTTPS協議

HTTPS協議在HTTP的基礎上整合了SSL/TLS安全性通訊協定層,從而為資料轉送提供了強大的加密保護。使用HTTPS協議訪問之前,您需要購買相應的數位憑證並完成認證託管。具體步驟,請參見綁定自訂網域名的認證託管

使用CDN加速

如果您希望提升靜態資源訪問的速度和穩定性,您可以為OSS開啟CDN加速,然後將自訂網域名綁定到CDN加速網域名稱上。具體操作,請參見綁定CDN加速網域名稱

避免盜刷

如果您希望避免Bucket內的資源被其他人盜用,您可以通過設定Referer列表(包括白名單Referer和黑名單Referer)以及是否允許空Referer的方式,限制您Bucket內資源的訪問來源。具體步驟,請參見防盜鏈

加速跨境傳輸

如果您希望提升跨境訪問的速度和穩定性,您可以將自訂網域名綁定到OSS傳輸加速網域名稱上。具體操作,請參見綁定CDN加速網域名稱

託管靜態網站

如果您希望將您的靜態網站託管到OSS,並使用自訂網域名訪問,您需要為儲存空間設定靜態網站託管。具體步驟,請參見靜態網站託管

常見問題

備案時不支援選擇OSS作為雲端服務怎麼辦

對於直接使用阿里雲OSS託管靜態網站的使用者,由於OSS服務不支援備案,您可以採取以下步驟來滿足備案要求:

  1. 購買用於備案伺服器:建議您購買一台最低配置、時間長度至少3個月的ECS執行個體,以滿足備案條件。

  2. 進行備案:使用該ECS執行個體進行相應的備案操作。

  3. 使用備案後的網域名稱:備案成功後,您可以將網域名稱指向阿里雲OSS,實現靜態網站的託管。

已有主機記錄與當前添加CNAME記錄產生的主機記錄相同,暫時無法自動添加CNAME記錄

當已有主機記錄與當前自動添加的CNAME記錄相同時,可能有以下幾種情況:

  • 衝突記錄:已存在一個使用相同主機記錄的記錄,但記錄類型可能與CNAME不同。例如,可能已經存在一個A記錄。

  • 重複記錄:已存在一個使用相同主機記錄的記錄,且記錄類型為CNAME記錄。這可能是因為先前已手動添加了相同的記錄。

在這種情況下,您可以在阿里雲Alibaba Cloud DNS控制台根據您的需求來決定如何處理:

  • 如果您希望保留已有的衝突或重複主機記錄,您可以重新自訂一個子網域名稱進行綁定。

  • 如果您不希望保留已有的主機記錄:

    • 如果是衝突記錄,您可以刪除該記錄,然後建立CNAME記錄解析至Bucket網域名稱。

    • 如果是重複記錄,您可以修改記錄,將其解析至Bucket網域名稱。

網域名稱綁定在自己的其他Bucket上

您需要解除Bucket綁定的網域名稱,然後重新綁定到當前Bucket上。具體操作,請參見OSS的網域名稱管理中綁定網域名稱時提示“網域名稱綁定在自己的其他Bucket上”

NeedVerifyDomainOwnership

你需要驗證網域名稱所有權。具體操作,請參見綁定自訂網域名時返回錯誤碼NeedVerifyDomainOwnership,怎麼辦?

綁定自訂網域名後,還是無法預覽檔案?

如果綁定自訂網域名並且CNAME解析生效後,仍然無法預覽檔案,請排查以下設定:

設定

異常原因

解決方案

OSS

Content-Type的值與實際的檔案類型不一致。瀏覽器無法正確解析和渲染該檔案,而只能將其作為下載檔案處理。

根據檔案類型,設定合理的Content-Type。具體操作,請參見如何設定Content-Type(MIME)?

Content-Disposition被設定為attachment。瀏覽器檢測到Content-Disposition: attachment時,會觸發下載行為。

將Content-Disposition設定為inline。具體步驟,請參見管理檔案中繼資料

CDN

緩衝資源未重新整理。

重新整理CDN緩衝資源。具體步驟,請參見重新整理和預熱資源

瀏覽器

不支援預覽該格式的檔案,例如表格檔案、文字檔、示範檔案以及PDF檔案。

您可以為瀏覽器安裝外掛程式以支援預覽該格式的檔案。

已經正常解析到WAF且有內容的網域名稱可以綁定至Bucket嗎?

可以正常綁定。WAF解析和CNAME解析不會發生衝突,因為它們在不同的層面上進行解析和操作。

綁定自訂網域名後,之前的檔案URL是否可以繼續使用?

可以繼續使用。如何擷取之前的檔案URL,請參見使用簽名URL下載檔案

使用自訂網域名就是公網訪問嗎?

一般是通過公網訪問。公網使用者通常需要以預覽的方式訪問您的OSS檔案,因此自訂網域名預設解析到Bucket的外網訪問網域名稱。

如何使用自訂網域名訪問OSS檔案時是下載行為?

如需實現使用自訂網域名訪問OSS檔案時是下載行為,您可以將Content-Disposition設定為attachment。具體操作,請參見如何配置通過自訂網域名訪問OSS檔案實現強制下載?

如何解除自訂網域名綁定?

當您不再使用自訂網域名時,您可以參考以下步驟解除綁定自訂網域名。

  1. 如果開啟了CDN加速,需要先關閉CDN加速。

    您需要修改CDN加速服務的來源站點資訊,使加速網域名稱不再指向OSS的Bucket網域名稱。具體操作,請參見配置來源站點

  2. 解除綁定自訂網域名。

    1. 登入OSS管理主控台

    2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

    3. 在左側導覽列,選擇Bucket配置>網域名稱管理

    4. 在網域名稱列表中,單擊目標網域名稱右側的網域名稱綁定配置

    5. 網域名稱綁定配置面板,單擊解除綁定然後單擊確定

  3. 刪除網域名稱解析。

    解除綁定自訂網域名後,您需要手動刪除配置的TXT解析記錄和CNAME解析記錄。具體操作,請參見刪除記錄

相關API

  • 關於建立網域名稱所有權驗證所需的CnameToken的介面,請參見CreateCnameToken

  • 關於擷取已建立的CnameToken的介面,請參見GetCnameToken

  • 關於為某個Bucket綁定自訂網域名的介面,請參見PutCname

  • 關於查詢某個Bucket下綁定的所有自訂網域名的介面,請參見ListCname

  • 關於刪除某個Bucket已綁定的自訂網域名的介面,請參見DeleteCname

  • 關於使用阿里雲解析DNS添加TXT解析記錄或CNAME解析記錄的介面,請參見AddDomainRecord - 根據傳入參數添加解析記錄