全部產品
Search
文件中心

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

更新時間:Feb 08, 2025

出於安全考慮,當您通過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。具體步驟,請參見建立儲存空間

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

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

操作步驟

步驟一:綁定自訂網域名

根據網域名稱所屬服務提供者(可在網域名稱資訊查詢(WHOIS)頁面查詢)和所屬帳號(可在Alibaba Cloud 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

    使用子網域名稱,為網站或行動裝置 App提供圖片資源。

    視頻儲存和播放

    video.example.com

    使用子網域名稱,以儲存和快速存取視頻內容。

    檔案分享權限設定和下載

    downloads.example.com

    使用子網域名稱,提供便捷的檔案下載服務。

    備份和日誌儲存

    backup.example.com

    使用子網域名稱,用於儲存備份資料或記錄檔,簡化資料管理流程。

    API 文檔託管

    docs.example.com

    使用子網域名稱,用於展示 API 文檔,方便開發人員進行訪問。

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

    自動添加

    綁定域名面板,開啟自動添加 CNAME 記錄

    1.png

    開啟後,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,然後複製頁面顯示的主機記錄記錄值

      自訂網域名樣本

      情境

      網域名稱樣本

      描述

      靜態網站託管

      example.com

      使用主網域名稱,使用者可以通過主網域名稱訪問託管在 OSS 上的完整網站內容。

      靜態資源服務

      static.example.com

      使用子網域名稱,用於集中管理和提供網站的靜態資源(如圖片、樣式表和指令碼等)。

      圖片服務

      images.example.com

      使用子網域名稱,為網站或行動裝置 App提供圖片資源。

      視頻儲存和播放

      video.example.com

      使用子網域名稱,以儲存和快速存取視頻內容。

      檔案分享權限設定和下載

      downloads.example.com

      使用子網域名稱,提供便捷的檔案下載服務。

      備份和日誌儲存

      backup.example.com

      使用子網域名稱,用於儲存備份資料或記錄檔,簡化資料管理流程。

      API 文檔託管

      docs.example.com

      使用子網域名稱,用於展示 API 文檔,方便開發人員進行訪問。

  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,然後複製頁面顯示的主機記錄記錄值

      自訂網域名樣本

      情境

      網域名稱樣本

      描述

      靜態網站託管

      example.com

      使用主網域名稱,使用者可以通過主網域名稱訪問託管在 OSS 上的完整網站內容。

      靜態資源服務

      static.example.com

      使用子網域名稱,用於集中管理和提供網站的靜態資源(如圖片、樣式表和指令碼等)。

      圖片服務

      images.example.com

      使用子網域名稱,為網站或行動裝置 App提供圖片資源。

      視頻儲存和播放

      video.example.com

      使用子網域名稱,以儲存和快速存取視頻內容。

      檔案分享權限設定和下載

      downloads.example.com

      使用子網域名稱,提供便捷的檔案下載服務。

      備份和日誌儲存

      backup.example.com

      使用子網域名稱,用於儲存備份資料或記錄檔,簡化資料管理流程。

      API 文檔託管

      docs.example.com

      使用子網域名稱,用於展示 API 文檔,方便開發人員進行訪問。

  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

步驟二:驗證自訂網域名

綁定自訂網域名後,當使用者通過自訂網域名發起請求時,該請求會通過 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。

    1. 擷取檔案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,有效時間為600秒。
    # 產生簽名URL時,OSS預設會對Object完整路徑中的正斜線(/)進行轉義,從而導致產生的簽名URL無法直接使用。
    # 設定slash_safe為True,OSS不會對Object完整路徑中的正斜線(/)進行轉義,此時產生的簽名URL可以直接使用。
    url = bucket.sign_url('GET', object_name, 600, 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(&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設定靜態網站託管

提升OSS檔案在不同地區的下載速度

OSS Bucket 中的檔案儲存體在某個地區(例如杭州)。為了提高不同地區使用者下載 OSS 檔案的速度,您可以使用CDN加速OSS。開啟CDN加速後,OSS 檔案會分發到各個地區的 CDN 緩衝節點。使用者在訪問檔案時,可以從離他們更近的緩衝節點擷取內容,從而有效提升下載速度。

說明

在使用 CDN 加速 OSS 的情況下,建議將 CDN 網域名稱用於檔案下載,而對於檔案上傳,您可以繼續使用原有的 Bucket 預設網域名稱。

提升OSS檔案的遠距離傳輸速度

OSS Bucket 中的檔案儲存體在某個地區(例如杭州)。非中國內地的使用者訪問時,可能因傳輸距離較遠導致上傳和下載體驗非常差。為提升 OSS 檔案的遠距離傳輸速度,您可以開啟傳輸加速,將自訂網域名綁定到 OSS 的傳輸加速網域名稱,而不是Bucket預設網域名稱。

常見問題

設定了Content-Disposition: inline,無法預覽

為確保資料轉送安全,使用OSS的Bucket預設網域名稱(<bucketName>.oss-<regionId>.aliyuncs.com)或傳輸加速網域名稱(<bucketName>.oss-accelerate.aliyuncs.com)訪問檔案時,OSS會強制增加下載回應標頭(x-oss-force-download: trueContent-Disposition: attachment)。瀏覽器檢測到Content-Disposition: attachment時,會強制下載。使用OSS網域名稱訪問檔案時,請求流程如下:

您可以在登入的網域名稱(例如example.com)上自訂一個子網域名稱(例如static.example.com),並將其綁定至Bucket,然後使用自訂網域名訪問檔案。此時,OSS不會在返回中強制增加下載回應標頭。由於OSS沒有設定 Content-Disposition 欄位,瀏覽器將根據檔案的MIME類型自動決定處理方式。對於大多數常見的檔案類型,瀏覽器會直接顯示檔案內容,而不是進行下載。

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

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

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

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

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

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

原因

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

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

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

解決方案

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

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

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

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

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

網域名稱綁定在其他Bucket上怎麼辦?

網域名稱綁定在其他Bucket上了,有以下兩種解決方案:

  • 自訂一個子網域名稱。例如,OSS提示oss.example.com已經被其他Bucket綁定了,您可以自訂一個子網域名稱,例如static.example.com,然後綁定這個新的子網域名稱。

  • 重新綁定。例如,OSS提示oss.example.com已經被其他Bucket綁定了,您需要解除綁定了這個網域名稱的Bucket,然後重新綁定到當前Bucket上。

    如何解除Bucket綁定的網域名稱

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

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

    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等檔案,使用WebOffice線上預覽

  • 對於.mov等視頻檔案,進行視頻轉碼後預覽。

綁定自訂網域名後,之前的檔案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

為什麼在使用 <video> 標籤時,如果伺服器設定了 Content-Disposition: attachment,某些瀏覽器仍然會選擇播放視頻,而不是下載?

使用 <video> 標籤時,瀏覽器會主動請求視頻流,並優先考慮 MIME 類型。如果伺服器返回的 MIME 類型適合播放(如 video/mp4),瀏覽器會選擇播放,而忽略 Content-Disposition: attachment 的指示。