すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:バケットのデフォルトドメイン名にカスタムドメイン名をマップする

最終更新日:Jul 04, 2025

セキュリティ上の理由から、バケットのデフォルトドメイン名を使用して特定のObject Storage Service (OSS) オブジェクトにアクセスすると、強制ダウンロードがトリガーされたり、ダウンロードが禁止されたりする可能性があります。これらのオブジェクトをブラウザでプレビューまたはダウンロードするには、カスタムドメイン名をバケットにマップし、カスタムドメイン名を使用してオブジェクトにアクセスする必要があります。カスタムドメイン名をマップしても、バケットのデフォルトドメイン名には影響しません。バケット内のOSSオブジェクトへのアクセスには、引き続きデフォルトドメイン名を使用できます。

シナリオ

  • オブジェクトのプレビュー: セキュリティ上の目的で、バケットのデフォルトドメイン名を使用してOSSオブジェクトにアクセスすると、OSSは自動的にダウンロードレスポンスヘッダーを追加します。これにより、ブラウザはオブジェクトのダウンロードを強制的に行います。ただし、カスタムドメイン名を使用して同じオブジェクトにアクセスする場合、OSSはダウンロードレスポンスヘッダーを追加しません。これにより、オブジェクトはダウンロードされるのではなく、ブラウザで直接プレビューできるようになります。デフォルトドメイン名を使用してOSSオブジェクトにアクセスすることでトリガーされる自動ダウンロードの有効時間と範囲については、「付録: 強制ダウンロードのためにトリガーされる x-oss-ec ルール」をご参照ください。

  • .apk または .ipa オブジェクトへのアクセス: セキュリティ上の目的で、バケットのデフォルトドメイン名を使用して .apk または .ipa オブジェクトにアクセスすると、ApkDownloadForbidden エラーコードを含む 400 エラーが発生します。ただし、カスタムドメイン名を使用して同じオブジェクトにアクセスしても制限はありません。

  • ブランドイメージとプロ意識の向上: カスタムドメイン名をOSSバケットにマップすることで、ブランドアイデンティティが強化され、プロ意識が強化され、ユーザーの信頼が築かれます。

  • ドメイン名ブロッキングのバイパス: OSSバケット内のリソースへのアクセスを確保するために、カスタムドメイン名をバケットにマップします。

  • アクセス利便性の向上: カスタムドメイン名を使用すると、アクセスが簡素化され、使いやすさが向上し、リソース共有がより効率的になります。

  • URL の永続性の確保: カスタムドメイン名をマップすることで、リソースURLの永続性が確保され、ストレージの場所やサービスが変更された場合でも、リソースに長期間アクセスして使用できます。

制限事項

  • 漢字を含むカスタムドメイン名はサポートされていません。

  • 画像処理用にすでにマップされているカスタムドメイン名は、バケットに再度マップすることはできません。

  • 各カスタムドメイン名は1つのバケットにのみマップできます。

  • 各バケットには最大 100 個のカスタムドメイン名をマップできます。

  • OSSコンソールは、ワイルドカードドメイン名をバケットにマップすることをサポートしていません。たとえば、アスタリスク (*) で始まるドメイン名はバケットにマップできません。このようなドメイン名がマップされている場合、そのドメイン名のすべてのサブドメインはバケットを指します。ただし、Alibaba Cloud CDN を使用してバケットへのアクセスを高速化する場合、ワイルドカードドメイン名をバケットにマップできます。この場合、ドメイン名はOSSコンソールに表示されません。

前提条件

手順

ステップ 1: カスタムドメイン名をマップする

カスタムドメイン名をバケットにマップするプロセスは、ドメインレジストラと所有アカウントによって異なります。Alibaba Cloud WHOIS ページでドメインレジストラを照会し、Alibaba Cloud DNS コンソールで関連付けられている所有アカウントを確認できます。

現在の Alibaba Cloud アカウントを使用して登録されたドメイン名をマップする

現在の Alibaba Cloud アカウントを使用して登録されたカスタムドメイン名をマップするには、次の手順を実行します。

  1. OSS コンソール にログインします。

  2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。[バケットリスト] ページで、目的のバケットを見つけてクリックします。

  3. 左側のナビゲーションウィンドウで、バケットの設定 > ドメイン名を選択します。

  4. ドメイン名 ページで、カスタムドメイン名のマッピング をクリックします。

  5. カスタムドメイン名のマッピング パネルで、static.example.com などのカスタムドメイン名を入力し、[確認] をクリックします。

    カスタムドメイン名の例

    シナリオ

    ドメイン名

    説明

    静的 Web サイトホスティング

    example.com

    ルートドメイン名。ユーザーは、ルートドメイン名を使用して、OSSでホストされているすべての Web サイトコンテンツにアクセスできます。

    静的リソースサービス

    static.example.com

    サブドメイン名。サブドメイン名を使用して、画像、スタイルシート、スクリプトなどの静的リソースを一元管理および提供できます。

    イメージサービス

    images.example.com

    サブドメイン名。サブドメイン名を使用して、 Web サイトまたはモバイル アプリケーションに画像リソースを提供できます。

    ビデオストレージと再生

    video.example.com

    サブドメイン名。サブドメイン名を使用して、ビデオリソースを保存できます。

    オブジェクトの共有とダウンロード

    downloads.example.com

    サブドメイン名。サブドメイン名を使用して、効率的なダウンロードサービスを提供できます。

    バックアップとログストレージ

    backup.example.com

    サブドメイン名。サブドメイン名を使用して、データバックアップまたはログファイルを保存できます。データ管理プロセスの最適化に役立ちます。

    API ドキュメントホスティング

    docs.example.com

    サブドメイン名。サブドメイン名は、開発者が API ドキュメントにアクセスするための一元化された場所を提供します。

  6. CNAME レコードを追加して、static.example.com ドメイン名をバケットのデフォルトドメイン名にマップします。

    CNAME レコードを自動的に追加する

    カスタムドメイン名のマッピング パネルで、CNAMEレコードを自動的に追加する をオンにします。

    1.png

    トグルをオンにすると、次の図に示すように、Alibaba Cloud DNS に CNAME レコードが自動的に追加されます。1.png

    CNAME レコードを手動で追加する

    CNAMEレコードを自動的に追加するカスタムドメイン名のマッピング パネルで有効にしない場合は、次の手順に従って Alibaba Cloud DNS コンソール で CNAME レコードを手動で追加します。

    1. Alibaba Cloud DNS コンソール にログインします。

    2. [パブリック DNS 解決 >] [権限のある DNS 解決] を選択します。[権限のあるドメイン名] タブで、ドメイン名を見つけて、[アクション] 列の [DNS 設定] をクリックします。

    3. [DNS 設定] タブで、[DNS レコードを追加] をクリックします。[DNS レコードを追加] ダイアログボックスで、次の表に示すパラメータを構成します。

      パラメータ

      説明

      レコードタイプ

      追加する DNS レコードのタイプ。ドメイン名を別のドメイン名にマップするには、CNAME を選択します。

      CNAME

      ホスト名

      ドメインのプレフィックス。

      static

      DNS リクエストソース

      ドメイン名の解決に使用する DNS 回線。DNS システムが最適な回線を自動的に選択できるように、このパラメータには [デフォルト] を選択することをお勧めします。

      デフォルト

      レコード値

      バケットのパブリックドメイン名。バケットのドメイン名は <bucketname>.<endpoint> 形式です。さまざまなリージョンのパブリックエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

      examplebucket.oss-cn-hangzhou.aliyuncs.com

      TTL

      レコードの更新間隔。デフォルト値を保持します。

      説明

      TTL 期間の設定は、有効になるまでに遅延が発生する場合があります。

      10 分

    4. [OK] をクリックします。

      次の図に示すように、Alibaba Cloud DNS のドメイン名の DNS レコードリストに CNAME レコードが表示されます。1.png

別の Alibaba Cloud アカウントを使用して登録されたドメイン名をマップする

Alibaba Cloud A を使用して登録されたドメイン名を、Alibaba Cloud B を使用して作成された OSS バケットにマップするには、次の手順を実行します。

  1. Alibaba Cloud アカウント B を使用して、TXT レコードのホスト名と値を取得します。

    1. OSS コンソール にログインします。

    2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。[バケット] ページで、目的のバケットを見つけてクリックします。

    3. 左側のナビゲーションウィンドウで、バケットの設定 > ドメイン名を選択します。

    4. ドメイン名 ページで、カスタムドメイン名のマッピング をクリックします。

    5. カスタムドメイン名のマッピング パネルで、Alibaba Cloud A を使用して登録したドメイン名(static.example.com など)を入力し、[ホスト名] パラメーターと [レコード値] パラメーターの値をコピーします。

      カスタムドメイン名の例

      シナリオ

      ドメイン名

      説明

      静的 Web サイトホスティング

      example.com

      ルートドメイン名。ユーザーは、ルートドメイン名を使用して、OSSでホストされているすべての Web サイトコンテンツにアクセスできます。

      静的リソースサービス

      static.example.com

      サブドメイン名。サブドメイン名を使用して、画像、スタイルシート、スクリプトなどの静的リソースを一元管理および提供できます。

      イメージサービス

      images.example.com

      サブドメイン名。サブドメイン名を使用して、 Web サイトまたはモバイル アプリケーションに画像リソースを提供できます。

      ビデオストレージと再生

      video.example.com

      サブドメイン名。サブドメイン名を使用して、ビデオリソースを保存できます。

      オブジェクトの共有とダウンロード

      downloads.example.com

      サブドメイン名。サブドメイン名を使用して、効率的なダウンロードサービスを提供できます。

      バックアップとログストレージ

      backup.example.com

      サブドメイン名。サブドメイン名を使用して、データバックアップまたはログファイルを保存できます。データ管理プロセスの最適化に役立ちます。

      API ドキュメントホスティング

      docs.example.com

      サブドメイン名。 サブドメイン名は、開発者が API ドキュメントにアクセスするための一元化された場所を提供します。

  2. Alibaba Cloud アカウント A を使用して、TXT レコードを追加します。

    1. Alibaba Cloud DNS コンソール にログオンします。

    2. ドメイン リストで、マップするドメイン名を探し、[アクション] 列の [DNS 設定] をクリックします。

    3. DNS設定タブで、[DNSレコードを追加] をクリックします。[DNSレコードを追加] ダイアログボックスで、次の表に示すパラメーターを設定します。

      パラメーター

      説明

      レコードタイプ

      追加する DNS レコードのタイプ。TXT を選択します。

      TXT

      ホスト名

      ルートドメイン名は自動的に入力されます。ルートドメインの部分を手動で入力する必要はありません。

      • ルートドメイン名をマップするには、_dnsauth と入力します。たとえば、ルートドメイン名が example.com の場合は、テキストボックスに _dnsauth と入力します。

      • サブドメインをマップするには、_dnsauth.<domain prefix> と入力します。たとえば、static.example.com をバケットにマップするには、テキストボックスに _dnsauth.static と入力します。

      _dnsauth.static

      DNSリクエストソース

      ドメイン名の解決に使用する DNS 回線。DNS システムが最適な回線を自動的に選択できるように、このパラメーターには [デフォルト] を選択することをお勧めします。

      Default

      レコード値

      Alibaba Cloud アカウント B を使用して以前に記録された TXT レコードのレコード値 (CnameToken)。

      b0d777f7ccddeae93358d908ed59****

      TTL

      レコードの更新間隔。デフォルト値を保持します。

      説明

      TTL 期間の設定は、有効になるまでに遅延が発生する場合があります。

      10 Minutes

    4. [OK] をクリックします。

  3. Alibaba Cloudアカウント B で OSS コンソールにログオンし、カスタムドメイン名のマッピング パネルに移動します。ドメイン名の所有権の確認 をクリックします。

  4. Alibaba Cloudアカウント A を使用して CNAME レコードを追加します。

    1. ドメインリストで、マップするドメイン名を見つけ、[アクション] 列の [DNS設定] をクリックします。

    2. [DNS設定] タブで、[DNSレコードを追加] をクリックします。 [DNSレコードを追加] ダイアログボックスで、次の表に示すパラメーターを設定します。

      パラメーター

      説明

      レコードタイプ

      追加する DNS レコードのタイプ。 CNAME を選択します。

      CNAME

      ホスト名

      ホスト名。

      • ドメイン名が example.com などのルートドメイン名である場合は、テキストボックスに [@] と入力します。

      • ドメイン名がサブドメイン名である場合は、テキストボックスにサブドメイン名のプレフィックスを入力します。 たとえば、サブドメイン名が static.example.com の場合は、static と入力します。

      static

      DNSリクエストソース

      ドメイン名の解決に使用する DNS 回線。 DNS システムが最適な回線を自動的に選択できるように、このパラメーターには [デフォルト] を選択することをお勧めします。

      デフォルト

      レコード値

      バケットのパブリックドメイン名。 バケットのドメイン名は、<bucketname>.<endpoint> 形式です。 リージョンごとのパブリックエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

      examplebucket.oss-cn-hangzhou.aliyuncs.com

      TTL

      レコードの更新間隔。 デフォルト値を保持します。

      説明

      TTL 期間の設定は、有効になるまでに遅延が発生する場合があります。

      10 分

    3. [OK] をクリックします。

サードパーティプロバイダで登録されたドメイン名をマップする

サードパーティプロバイダで登録されたドメイン名を OSS バケットにマップするには、次の手順を実行します。

  1. OSS コンソールで、ホスト名と値を TXT レコードとして生成します。

    1. OSS コンソール にログインします。

    2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。「バケット」ページで、目的のバケットを見つけてクリックします。

    3. 左側のナビゲーションウィンドウで、バケットの設定 > ドメイン名 を選択します。

    4. ドメイン名 ページで、カスタムドメイン名のマッピング をクリックします。

    5. カスタムドメイン名のマッピング パネルで、サードパーティプロバイダで登録されているカスタムドメイン名(例:static.example.com)を入力し、[ホスト名] パラメーターと [レコード値] パラメーターの値をコピーします。

      カスタムドメイン名の例

      シナリオ

      ドメイン名

      説明

      静的 Web サイトホスティング

      example.com

      ルートドメイン名。 ユーザーは、ルートドメイン名を使用して、OSS でホストされているすべての Web サイトコンテンツにアクセスできます。

      静的リソースサービス

      static.example.com

      サブドメイン名。 サブドメイン名を使用して、イメージ、スタイルシート、スクリプトなどの静的リソースを一元管理および提供できます。

      イメージサービス

      images.example.com

      サブドメイン名。 サブドメイン名を使用して、Web サイトまたはモバイル アプリケーションにイメージリソースを提供できます。

      ビデオストレージと再生

      video.example.com

      サブドメイン名。 サブドメイン名を使用して、ビデオリソースを保存できます。

      オブジェクトの共有とダウンロード

      downloads.example.com

      サブドメイン名。 サブドメイン名を使用して、効率的なダウンロードサービスを提供できます。

      バックアップとログストレージ

      backup.example.com

      サブドメイン名。 サブドメイン名を使用して、データバックアップまたはログファイルを保存できます。 データ管理プロセスの最適化に役立ちます。

      API ドキュメントホスティング

      docs.example.com

      サブドメイン名。 サブドメイン名は、開発者が API ドキュメントにアクセスするための一元化された場所を提供します。

  2. ドメインレジストラーの DNS プラットフォームで、次の表に示すパラメーターを使用して TXT レコードを追加します。

    パラメーター

    説明

    レコードタイプ

    追加する DNS レコードのタイプ。TXT を選択します。

    TXT

    ホスト名

    DNS プラットフォームがルートドメイン名を自動的に入力する場合、ルートドメイン部分を手動で入力する必要はありません。

    • ルートドメイン名をマップするには、_dnsauth と入力します。 たとえば、ルートドメイン名が example.com の場合は、テキストボックスに _dnsauth と入力します。

    • サブドメインをマップするには、_dnsauth.<domain prefix> と入力します。 たとえば、static.example.com をバケットにマップするには、テキストボックスに _dnsauth.static と入力します。

    _dnsauth.static

    レコード値

    OSS から以前に記録された TXT レコードのレコード値(CnameToken)。

    b0d777f7ccddeae93358d908ed59****

  3. OSS コンソールの カスタムドメイン名のマッピング パネルに戻ります。ドメイン名の所有権の確認 をクリックします。

  4. ドメインレジストラーの DNS プラットフォームで、次の表に示すパラメーターを使用して CNAME レコードを追加します。

    パラメーター

    説明

    レコードタイプ

    追加する DNS レコードのタイプ。 CNAME を選択します。

    CNAME

    ホスト名

    ホスト名。

    • ドメイン名が example.com などのルートドメイン名である場合は、テキストボックスに [@] と入力します。

    • ドメイン名がサブドメイン名である場合は、テキストボックスにサブドメイン名のプレフィックスを入力します。 たとえば、サブドメイン名が static.example.com の場合は、static と入力します。

    static

    レコード値

    バケットのパブリックドメイン名。 バケットのドメイン名は、<bucketname>.<endpoint> 形式です。 さまざまなリージョンのパブリックエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

    examplebucket.oss-cn-hangzhou.aliyuncs.com

ステップ 2: カスタムドメイン名を確認する

カスタムドメイン名をバケットにマップした後、カスタムドメイン名を使用して行われたリクエストはすべて、DNS を介してバケットのデフォルトドメイン名に解決されます。 カスタムドメイン名の DNS レコードを確認するには、nslookup コマンドまたは dig コマンドを実行できます。

nslookup

次のコマンドの static.example.com を実際のドメイン名に置き換えて、コマンドを実行します。

nslookup -type=CNAME static.example.com

コマンド出力にバケットのパブリックドメイン名が表示された場合、DNS レコードは有効になっています。

1.png

dig

次のコマンドの static.example.com を実際のドメイン名に置き換えて、コマンドを実行します。

dig CNAME static.example.com

コマンド出力にバケットのパブリックドメイン名が表示された場合、DNS レコードは有効になっています。

2.png

ステップ 3: カスタムドメイン名を使用する

カスタムドメイン名の DNS レコードが有効になった後、HTTP プロトコルとカスタムドメイン名を使用して URL を構築できます。これには、署名と有効期間が含まれます。 URL の形式は http://YourDomain/ObjectName?SignatureInformation です。その後、この URL を使用して OSS バケット内のオブジェクトにアクセスできます。

  1. 署名付き URL を取得します。

    OSS コンソールを使用する

    1. OSS コンソール にログインします。

    2. 左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、バケットの名前をクリックします。

    3. 左側のナビゲーションツリーで、オブジェクト管理 > オブジェクト を選択します。

    4. [オブジェクト] ページで、オブジェクトの名前をクリックします。

    5. [詳細の表示] パネルで、[カスタムドメイン名] フィールドのバケットにマッピングされているカスタムドメイン名を選択し、他のパラメーターのデフォルト設定を保持して、[オブジェクト URL のコピー] をクリックします。

      2.png

    ossbrowser を使用する

    ossbrowser を使用して、OSS コンソールで実行できるのと同じオブジェクトレベルの操作を実行できます。 ossbrowser の画面上の指示に従って、署名付き URL を取得できます。 ossbrowser のダウンロード方法については、「ossbrowser 1.0」をご参照ください。

    1. カスタムドメイン名を使用して ossbrowser にログインします。

    1. オブジェクトの URL を取得します。

    OSS SDK を使用する

    カスタムドメイン名を使用して、OssClient インスタンスを作成し、署名付き URL を生成できます。

    Java

    import com.aliyun.oss.*;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.common.comm.SignVersion;
    import com.aliyun.oss.model.GeneratePresignedUrlRequest;
    
    import java.net.URL;
    import java.util.Date;
    
    public class Demo {
        public static void main(String[] args) throws Throwable {
            // カスタムドメイン名を指定します。例: https://static.example.com。
            String endpoint = "yourCustomEndpoint";
            // バケットが配置されているリージョンを指定します。例: cn-hangzhou。
            String region = "cn-hangzhou";
            // バケットの名前を指定します。例: examplebucket。
            String bucketName = "examplebucket";
            // オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
            String objectName = "exampleobject.txt";
    
            // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数を構成する必要があります。
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
    
            // OSSClient インスタンスを作成します。
            // OSSClient が不要になったら、shutdown メソッドを呼び出してリソースを解放します。
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            // CNAME を有効にするには、このパラメーターを true に設定します。
            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);
    
                // 署名付き URL を生成します。
                GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
    
                // URL の有効期間を設定します。
                request.setExpiration(expiration);
    
                // HTTP GET リクエストを許可する署名付き URL を生成します。
                URL signedUrl = ossClient.generatePresignedUrl(request);
                // 署名付き URL を表示します。
                System.out.println("signed url for getObject: " + signedUrl);
            } 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())
    
    # エンドポイントにマッピングされるリージョンの ID を指定します。例: cn-hangzhou。署名アルゴリズム V4 を使用する場合は、このパラメーターが必要です。
    region = "cn-hangzhou"
    
    # カスタムドメイン名を指定します。例: static.example.com。
    endpoint = 'http://static.example.com'
    
    # バケットの名前を指定します。
    bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region, is_cname=True)
    
    
    # オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
    object_name = 'exampledir/exampleobject.txt'
    
    # オブジェクトのダウンロードに使用される署名付き URL を生成します。この例では、URL の有効期間は 600 秒です。
    # デフォルトでは、OSS は署名プロセスでオブジェクトの完全なパスにあるスラッシュ (/) をエスケープ文字として識別します。したがって、署名付き URL は直接使用できません。
    # slash_safe パラメーターを True に設定します。このようにして、OSS はオブジェクトの完全なパスにあるスラッシュ (/) をエスケープ文字として識別せず、署名付き URL を直接使用できます。
    url = bucket.sign_url('GET', object_name, 600, slash_safe=True, params=params)
    print('Presigned URL:', url)

    Node.js

    const OSS = require("ali-oss");
    
    // 署名付き URL を生成するために使用される関数を指定します。
    async function generateSignatureUrl(fileName) {
      // 署名付き URL を取得します。
      const client = await new OSS({
          // バケットにマッピングするカスタムドメイン名を指定します。
          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',
          // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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 を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを http://static.example.com に設定します。
    $endpoint = "http://static.example.com";
    // バケット名を指定します。
    $bucket= "examplebucket";
    // バケット名を除くオブジェクトの完全なパスを指定します。
    $object = "exampleobject.txt";
    // 署名付き URL の有効期間を 600 秒 (最大 32400 秒) に設定します。
    $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", "", "バケットが配置されているリージョン。")
    	flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
    	flag.StringVar(&objectName, "object", "", "オブジェクトの名前。")
    }
    
    func main() {
    	// コマンドラインパラメーターを解析します。
    	flag.Parse()
    
    	// バケットの名前が指定されているかどうかを確認します。
    	if len(bucketName) == 0 {
    		flag.PrintDefaults()
    		log.Fatalf("無効なパラメーター、バケット名が必要です")
    	}
    
    	// リージョンが指定されているかどうかを確認します。
    	if len(region) == 0 {
    		flag.PrintDefaults()
    		log.Fatalf("無効なパラメーター、リージョンが必要です")
    	}
    
    	// オブジェクトが指定されているかどうかを確認します。
    	if len(objectName) == 0 {
    		flag.PrintDefaults()
    		log.Fatalf("無効なパラメーター、オブジェクト名が必要です")
    	}
    
    	// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
    	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"), // リクエスターの ID を指定します。
    	},
    		oss.PresignExpires(10*time.Minute),
    	)
    	if err != nil {
    		log.Fatalf("オブジェクトの署名付き URL の取得に失敗しました %v", err)
    	}
    
    	log.Printf("リクエストメソッド:%v\n", result.Method)
    	log.Printf("リクエストの有効期限:%v\n", result.Expiration)
    	log.Printf("リクエスト URL:%v\n", result.URL)
    	if len(result.SignedHeaders) > 0 {
    		// HTTP GET リクエストを許可する署名付き URL を生成するときにリクエストヘッダーを指定する場合は、署名付き URL を使用して開始された GET リクエストにリクエストヘッダーが含まれていることを確認してください。これにより、リクエストの失敗と署名エラーを防ぎます。
    		log.Printf("署名付きヘッダー:\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 操作

  • ドメイン所有権検証のために呼び出すことができる CNAME トークンを作成する API 操作の詳細については、「CreateCnameToken」をご参照ください。

  • CNAME トークンをクエリするために呼び出すことができる API 操作の詳細については、「GetCnameToken」をご参照ください。

  • カスタムドメイン名をバケットにマッピングするために呼び出すことができる API 操作の詳細については、「PutCname」をご参照ください。

  • バケットのドメイン名を指すすべての CNAME レコードをクエリするために呼び出すことができる API 操作の詳細については、「ListCname」をご参照ください。

  • バケットの CNAME レコードを削除するために呼び出すことができる API 操作の詳細については、「DeleteCname」をご参照ください。

  • TXT レコードまたは CNAME レコードを追加するために呼び出すことができる API 操作の詳細については、「AddDomainRecord」をご参照ください。

次のステップ

HTTPS 経由で OSS オブジェクトにアクセスする

デフォルトでは、SSL 証明書が設定されていない場合、カスタムドメイン名に対して HTTPS 経由のアクセスはサポートされていません。 HTTPS 経由でカスタムドメイン名を使用してオブジェクトにアクセスしようとすると、ブラウザには安全ではない接続の警告が表示されます。 HTTPS アクセスを有効にするには、カスタムドメイン名に対してSSL 証明書を設定する必要があります。

httpsandpresigned

署名されていない永続的に有効な URL を使用して OSS オブジェクトにアクセスする

警告

取得した URL が tttp://YourDomainName/ObjectName 形式の場合、署名または有効期限は含まれていません。 この URL を使用してオブジェクトにアクセスするには、オブジェクトのアクセス制御リスト(ACL)が公開読み取りであることを確認してください。 ただし、公開読み取り ACL を使用すると、すべてのインターネットユーザーがオブジェクトにアクセスできるため、データ漏洩やコストの増加につながる可能性があります。 セキュリティを強化するために、署名と有効期限を含む URL を使用することをお勧めします。

次のいずれかの方法を使用して、オブジェクトへの公開読み取りアクセスを許可できます。

  • オブジェクトの ACL を公開読み取りに設定する: OSS オブジェクトの ACL を公開読み取りに設定できます。 これにより、オブジェクトの URL は誰でも永続的にアクセスできるようになります。 承認されていない Web サイトからのアクセスをブロックするには、OSS でホットリンク保護を有効にします。

  • Alibaba Cloud CDN を使用してアクセスを高速化する: OSS オブジェクトの安全なアクセス制御を確保するために、ACL を非公開に設定し、Alibaba Cloud CDN を使用して公開アクセスできるようにすることができます。 これにより、オブジェクトの URL は誰でも永続的にアクセスできるようになります。 承認されていない Web サイトからのアクセスをブロックするには、Alibaba Cloud CDN でホットリンク保護を有効にします。

https

他の Web サイトによる OSS オブジェクトの不正使用を防止する

デフォルトでは、OSS オブジェクトはどの Web サイトからでもアクセスして表示できます。 これにより、不要なリクエストとアウトバウンドトラフィック料金が発生する可能性があります。 このリスクを軽減するには、Referer ブラックリストまたはホワイトリストを設定してホットリンク保護を有効にします。 これにより、アクセスが意図したユーザーに制限されます。 ホットリンク保護が有効になると、承認されていない Web サイトはオブジェクトへのリンクがブロックされ、失敗したリクエストに対してリクエスト料金とアウトバウンドトラフィック料金は発生しません。

OSS で静的 Web サイトをホストする

HTML、CSS、JavaScript リソースなどの静的リソースをインターネット経由で保存および配信するための静的 Web サイトサーバーとして OSS を使用するには、カスタムドメイン名を OSS バケットにマッピングし、静的 Web サイトホスティングを設定する必要があります。

リージョン全体で OSS オブジェクトのダウンロード速度を向上させる

たとえば、OSS オブジェクトが中国(杭州)に保存されている場合、Alibaba Cloud CDN は、他のリージョンのユーザーによるこれらのオブジェクトへのアクセスを高速化できます。 Alibaba Cloud CDN が有効になっている場合、OSS オブジェクトはリージョナル ポイント オブ プレゼンス(POP)にキャッシュされます。 これらのオブジェクトにアクセスするユーザーは、最も近い POP に自動的にルーティングされ、より高速で効率的なダウンロードが保証されます。

説明

リージョン全体のパフォーマンスを最適化するために、ダウンロードには CDN アクセラレーションドメイン名を使用してアクセスを高速化し、アップロードにはバケットのデフォルトドメイン名を使用することをお勧めします。

OSS オブジェクトの長距離伝送を最適化する

たとえば、OSS オブジェクトが中国(杭州)に保存されている場合、中国本土以外からアクセスするユーザーは、アップロードとダウンロードの速度が遅くなる可能性があります。 国境を越えたアクセス速度と安定性を向上させるには、転送アクセラレーションを有効にすることができます。 この機能は、カスタムドメイン名をバケットの OSS アクセラレーションドメイン名にマッピングします。

よくある質問

Content-Disposition: Inline を設定した後、オブジェクトコンテンツをプレビューできないのはなぜですか?Content-Disposition: インラインヒント:

デフォルトのバケットドメイン名(<bucketName>.oss-<regionId>.aliyuncs.com)または OSS アクセラレーテッドドメイン名(<bucketName>.oss-accelerate.aliyuncs.com)を使用して、ブラウザからバケット内の Web サイトファイルまたは画像にアクセスするリクエストが行われた場合、OSS はセキュリティを確保するために、x-oss-force-download: true ヘッダーと Content-Disposition: attachment ヘッダーをレスポンスに含めます。Content-Disposition: attachment ヘッダーは、リクエストに Content-Disposition: inline ヘッダーが含まれている場合でも、ブラウザで強制ダウンロードをトリガーします。

2.png

ブラウザでオブジェクトコンテンツのプレビューを有効にするには、登録済みドメイン名のカスタムサブドメインをバケットにマップし、カスタムサブドメインを使用してブラウザからバケット内のオブジェクトにアクセスします。この場合、OSS は強制ダウンロードを指定するヘッダーをレスポンスに含めません。その結果、ブラウザはコンテンツの MIME(Multipurpose Internet Mail Extensions)タイプに基づいてコンテンツの処理方法を決定します。 ブラウザは、ほとんどの MIME タイプをダウンロードするのではなく、インラインで表示します。

OSS バケットでホストされている静的 Web サイトの ICP 登録を完了するにはどうすればよいですか?

Alibaba Cloud OSS を使用して静的 Web サイトをホストしている場合、OSS は ICP 登録をサポートしていないことに注意してください。ICP 登録要件に準拠するには、次の手順に従います。

  1. 最小構成の Elastic Compute Service(ECS)インスタンス を購入し、ICP 登録要件を満たすためにサブスクリプション期間が少なくとも 3 か月であることを確認します。

  2. 購入した ECS インスタンスを使用して、ICP 登録プロセスを完了します。

  3. ICP 登録が承認されたら、登録済みのドメイン名を OSS バケットにポイントします。

ホスト名が既に存在するため、CNAME レコードを自動的に追加できないことを示すエラーを受け取った場合はどうすればよいですか?

原因

既存のホスト名が自動的に追加される CNAME レコードのホスト名と一致する場合、次のいずれかの原因が考えられます。

  • ホスト名の競合。ホスト名は、A レコードなど、異なるタイプの DNS レコードによって使用されています。

  • 重複レコード: ホスト名は別の CNAME レコードによって使用されています。たとえば、既に手動で同一の CNAME レコードを追加している場合などです。

解決策

この問題を解決するには、Alibaba Cloud DNS コンソールで、要件に基づいて次の手順に従います。

  • ホスト名を使用する既存の DNS レコードを保持する場合は、ドメインマッピングに別のサブドメインを使用します。

  • 既存の DNS レコードを保持しない場合は、必要に応じて次のいずれかの操作を実行します。

    • 既存のレコードが CNAME レコードでない場合は、既存のレコードを削除し、同じホスト名で新しい CNAME レコードを追加してから、デフォルトのバケットドメイン名に解決します。

    • 既存のレコードが CNAME レコードの場合は、レコードをデフォルトのバケットドメイン名を指すように変更します。

使用したいカスタムドメイン名が既に別のバケットにマップされている場合はどうすればよいですか?

使用したいカスタムドメイン名が既に別のバケットにマップされている場合は、次のいずれかの方法を使用して問題を解決します。

  • 目的のドメイン名のサブドメインを使用します。たとえば、oss.example.com が既に別のバケットにマップされている場合は、static.example.com などのサブドメインを作成し、バケットにマップします。

  • ドメイン名のマッピングを解除して再マップします。たとえば、oss.example.com が別のバケットにマップされている場合は、そのバケットからマッピングを解除してから、バケットにマップします。

    OSS バケットからドメイン名のマッピングを解除するにはどうすればよいですか?

    1. Alibaba Cloud CDN が有効になっている場合は、OSS バケットからドメイン名のマッピングを解除する前に無効にする必要があります。

      Alibaba Cloud CDN を無効にするには、オリジンサーバー設定を変更して、アクセラレーテッドドメイン名と OSS バケットの関連付けを削除する必要があります。オリジンサーバー設定の変更方法については、「オリジンサーバーを構成する」をご参照ください。

    2. OSS バケットからドメイン名のマッピングを解除します。

      1. OSS コンソール にログインします。

      2. 左側のナビゲーションウィンドウで、バケットリスト をクリックします。「バケット」ページで、目的のバケットを見つけてクリックします。

      3. 左側のナビゲーションツリーで、バケットの設定 >ドメイン名 を選択します。

      4. 「ドメイン名」ページで、マッピングを解除するカスタムドメイン名を見つけて、「操作」列の [マッピング構成の管理] をクリックします。

      5. [マッピング構成の管理] パネルで、[マッピング解除] をクリックします。表示されるメッセージで、[OK] をクリックします。

    3. ドメイン名の DNS レコードを削除します。

      ドメイン名のマッピングを解除した後、TXT レコードと CNAME レコードを削除します。詳細については、「DNS レコードを削除する」をご参照ください。

NeedVerifyDomainOwnership エラーコードを修正するにはどうすればよいですか?

ドメインの所有権を確認する必要があります。詳細については、「カスタムドメイン名をバケットにマップするときに NeedVerifyDomainOwnership エラーコードが返された場合はどうすればよいですか?」をご参照ください。

カスタムドメイン名をバケットにマップした後、オブジェクトコンテンツをプレビューできないのはなぜですか?

カスタムドメイン名をバケットにマップし、CNAME レコードが有効になっているにもかかわらず、ブラウザでオブジェクトコンテンツをプレビューできない場合は、次の手順に従って問題のトラブルシューティングを行ってください。

設定

原因

解決策

OSS

Content-Type ヘッダー値が実際のオブジェクトタイプと一致しません。この場合、ブラウザはオブジェクトを正しく解析またはレンダリングできず、オブジェクトをダウンロードすることしかできません。

この問題を解決するには、Content-Type ヘッダー値を更新して、正しいオブジェクトタイプを反映させます。詳細については、「Content-Type ヘッダーを構成するにはどうすればよいですか?」をご参照ください。

Content-Disposition ヘッダーが attachment に設定されているため、ブラウザはオブジェクトのコンテンツを表示するのではなく、オブジェクトをダウンロードするように促されます。

コンテンツがブラウザに直接表示されるようにするには、Content-Disposition ヘッダーを inline に設定します。詳細については、「オブジェクトメタデータを管理する」をご参照ください。

CDN

POP にキャッシュされたリソースが更新されていません。

POP にキャッシュされたリソースを更新します。詳細については、「リソースのパージとプリフェッチ」をご参照ください。

ブラウザ

.doc、.ppt、.pdf、.mov 形式のオブジェクトのプレビューはサポートされていません。

  • これらの形式のオブジェクトのプレビューをサポートするために、ブラウザ用のプラグインをインストールします。

  • .doc、.ppt、.pdf 形式のオブジェクトの場合、WebOffice を使用すると、ブラウザプラグインを必要とせずに、コンテンツをオンラインでプレビューできます。

  • .mov 形式のオブジェクトの場合、トランスコード中 の後にコンテンツをプレビューできます。

カスタムドメイン名をバケットにマップした後でも、元の URL を使用してオブジェクトにアクセスできますか?

はい、できます。オブジェクト URL の生成方法の詳細については、「署名付き URL を使用してオブジェクトをダウンロードする」をご参照ください。

カスタムドメイン名に基づくオブジェクトへのアクセスはインターネット経由で行われますか?

カスタムドメイン名を使用したアクセスは、通常インターネット経由で行われます。インターネットユーザーは OSS オブジェクトをプレビューする必要があることが多いため、バケットのカスタムドメイン名はデフォルトでパブリックドメイン名に解決されます。これにより、インターネットユーザーのアクセシビリティが確保されます。

ブラウザでカスタムドメイン名を使用してアクセスしたときに、オブジェクトが確実にダウンロードされるようにするにはどうすればよいですか?

ブラウザでカスタムドメイン名を使用してアクセスしたときにオブジェクトが確実にダウンロードされるようにするには、Content-Disposition ヘッダーを attachment に設定します。詳細については、「バケットのカスタムドメインを使用してオブジェクトにアクセスしたときに、OSS バケットからオブジェクトを強制的にダウンロードするにはどうすればよいですか?」をご参照ください。

構成した DNS レコードが有効にならない場合はどうすればよいですか?

構成した DNS レコードが機能しない場合は、ローカル DNS キャッシュが原因である可能性があります。これを解決するには、次のコマンドを使用して DNS キャッシュをクリアし、再試行してください。

Window

 ipconfig /flushdns

macOS

 sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Linux

 sudo systemd-resolve --flush-caches

サーバーが Content-Disposition ヘッダーを attachment に設定している場合でも、一部のブラウザが <video> タグ内のビデオをダウンロードせずに再生するのはなぜですか?

ビデオが <video> タグ内にある場合、ブラウザはビデオストリームをリクエストし、MIME タイプを優先します。サーバーが video/mp4 などの再生可能な MIME タイプを返した場合、ブラウザはビデオを再生し、Content-Disposition: attachment ヘッダーを無視します。