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

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

最終更新日:Mar 20, 2025

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

シナリオ

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

  • .apk または .ipa オブジェクトへのアクセス: セキュリティ上の目的で、バケットのデフォルトドメイン名を使用して .apk または .ipa オブジェクトにアクセスすると、ApkDownloadForbidden エラーコードとともに 400 エラーが発生します。ただし、カスタムドメイン名を使用して同じオブジェクトにアクセスしても制限はありません。デフォルトドメイン名を使用して OSS オブジェクトにアクセスすることでトリガーされるブロックされたアクセスの有効時間と範囲については、「付録」をご参照ください。

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

  • ドメイン名ブロックのバイパス: 一部のアプリケーションまたはプラットフォームでは、バケットのデフォルトドメイン名がブロックされる場合があります。OSS バケット内のリソースへのアクセスを確保するために、カスタムドメイン名をバケットにマップすることをお勧めします。

  • アクセス利便性の向上: カスタムドメイン名は、デフォルトドメイン名よりも覚えやすいです。アクセスを簡素化し、使いやすさを向上させ、リソース共有をより効率的にします。

  • URL の永続性の確保: カスタムドメイン名を OSS バケットにマップすると、ストレージの場所やサービスが変更された場合でも、リソースへのアクセスに同じドメイン名を引き続き使用できます。これにより、リソース URL の永続性が確保され、リソースへの長期的なアクセスと使用が可能になります。

制限事項

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

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

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

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

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

前提条件

  • OSS バケットが作成されている。詳細については、「バケットを作成する」をご参照ください。

  • カスタムドメイン名が登録されている。サードパーティプロバイダに登録されているドメイン名を Alibaba Cloud のバケットにマップできます。ドメイン名がない場合は、Alibaba Cloud Domains サービスプラットフォームを使用して登録できます。詳細については、「Alibaba Cloud でドメイン名を登録する」をご参照ください。

  • ドメイン名にインターネットコンテンツプロバイダ (ICP) ファイリングが取得されており、ドメイン名のマップ先となるバケットが中国本土にある場合は、Alibaba Cloud アカウントの実名登録が完了している。IPC ファイリングと実名登録の詳細については、「ICP ファイリングプロセス」および「Alibaba Cloud アカウントの実名登録に関する FAQ」をご参照ください。

手順

ステップ 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.<ドメインプレフィックス> と入力します。たとえば、static.example.com をバケットにマップするには、テキストボックスに _dnsauth.static と入力します。

      _dnsauth.static

      [DNS リクエストソース]

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

      デフォルト

      [レコード値]

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

      b0d777f7ccddeae93358d908ed59****

      [TTL]

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

      説明

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

      10 分

    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.<ドメインプレフィックス> と入力します。たとえば、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 java.net.URL;
    import java.util.Date;
    
    public class Demo {
        public static void main(String[] args) throws Throwable {
            // カスタムドメイン名を指定します。例: static.example.com。
            String endpoint = "http://static.example.com";
            // エンドポイントにマップするリージョンの ID を指定します。例: 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);
                // HTTP 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("OSSException がキャッチされました。これは、リクエストが OSS に到達しましたが、"
                        + "何らかの理由でエラーレスポンスで拒否されたことを意味します。");
                System.out.println("エラーメッセージ:" + oe.getErrorMessage());
                System.out.println("エラーコード:" + oe.getErrorCode());
                System.out.println("リクエスト ID:" + oe.getRequestId());
                System.out.println("ホスト ID:" + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("ClientException がキャッチされました。これは、クライアントが OSS と通信しようとしているときに、"
                        + "ネットワークにアクセスできないなど、重大な内部問題が発生したことを意味します。");
                System.out.println("エラーメッセージ:" + 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())
    
    # バケットが配置されているリージョンを指定します。例: 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)
    
    
    # オブジェクトのフルパス (例: exampledir/exampleobject.txt) を指定します。オブジェクトのフルパスにバケット名を含めないでください。
    object_name = 'exampledir/exampleobject.txt'
    
    # オブジェクトをダウンロードするためのプレサイン URL を生成します。URL は 600 秒間有効です。
    # プレサイン URL が生成されると、OSS はオブジェクトのフルパスにあるスラッシュ (/) をエスケープ文字として識別します。その結果、生成されたプレサイン URL は直接使用できません。
    # slash_safe パラメータを True に設定します。このようにして、OSS はオブジェクトのフルパスにあるスラッシュ (/) をエスケープ文字として識別せず、プレサイン 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: '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('生成された署名付き URL:', url);
    }).catch(err => {
      console.error('署名付き 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();
    // バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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__ . ": 失敗\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("オブジェクトのプレサインの取得に失敗しました %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 {
    		// レスポンス結果に署名付きヘッダーが含まれている場合は、署名付き URL を使用して HTTP GET リクエストを送信するときに、対応するリクエストヘッダーを含める必要があります。これにより、リクエストの失敗や署名エラーの原因となる可能性のある不整合を回避できます。
    		log.Printf("署名付きヘッダー:\n")
    		for k, v := range result.SignedHeaders {
    			log.Printf("%v: %v\n", k, v)
    		}
    	}
    }

    ossutil を使用する

    presign コマンドを実行して、カスタムドメイン名を使用してオブジェクトのプレサイン 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 操作

  • ドメインの所有権を確認するために呼び出すことができる 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 サイトからでもアクセスして表示できます。これにより、不要なリクエストとアウトバウンドトラフィック料金が発生する可能性があります。このリスクを軽減するには、リファラーブラックリストまたはホワイトリストを構成して ホットリンク保護 を有効にします。これにより、アクセスが意図したユーザーに制限されます。ホットリンク保護が有効になると、権限のない Web サイトはオブジェクトへのリンクがブロックされ、失敗したリクエストに対してリクエスト料金とアウトバウンドトラフィック料金は発生しません。

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

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

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

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

説明

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

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

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

FAQ

オブジェクト コンテンツのプレビューを構成した後にプレビューできないのはなぜですか?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 ヘッダーが含まれている場合でも、ブラウザで強制ダウンロードをトリガーします。

ブラウザでオブジェクトコンテンツのプレビューを有効にするには、登録済みドメインのカスタムサブドメインをバケットにマップし、カスタムサブドメインを使用してブラウザからバケット内のオブジェクトにアクセスします。この場合、OSS はレスポンスに強制ダウンロードを指定するヘッダーを含めません。その結果、ブラウザはコンテンツの多目的インターネットメール拡張機能 (MIME) タイプに基づいてコンテンツの処理方法を決定します。 ブラウザは、ほとんどの 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 ヘッダーを無視します。