ブラウザの同一オリジンポリシーにより、異なるドメイン名間でデータ交換またはリソース共有が行われる際に、クロスオリジンリクエストが拒否される場合があります。このトピックでは、クロスオリジンリソース共有 (CORS) ルールを構成する方法について説明します。CORS ルールでは、リクエストの送信元ドメイン名、クロスオリジンリクエストの送信に使用できるメソッド、および許可されるヘッダーを指定できます。
使用上の注意
このトピックのサンプルコードでは、中国 (杭州) リージョン (
cn-hangzhou) を例として使用します。デフォルトでは、パブリックエンドポイントが使用されます。同じリージョン内の他の Alibaba Cloud プロダクトから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS リージョンとエンドポイント間のマッピングの詳細については、「OSS リージョンとエンドポイント」をご参照ください。CORS ルールを設定するには、
oss:PutBucketCors権限が必要です。CORS ルールを取得するには、oss:GetBucketCors権限が必要です。CORS ルールを削除するには、oss:DeleteBucketCors権限が必要です。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。
例
CORS ルールの構成
次のサンプルコードは、バケットの CORS ルールを構成する方法の例を示しています。
<?php
// 依存ライブラリを読み込むために、autoload ファイルを導入します。
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// コマンドラインパラメータの説明を指定します。
$optsdesc = [
"region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
"endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
"bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
];
// コマンドラインパラメータを解析するための長いオプションリストを生成します。
$longopts = \array_map(function ($key) {
return "$key:"; // 各パラメータの末尾にコロン (:) を追加して、値が必要であることを示します。
}, array_keys($optsdesc));
// コマンドラインパラメータを解析します。
$options = getopt("", $longopts);
// 必須パラメータが構成されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help"; // 必須パラメータが構成されていないことを指定します。
exit(1);
}
}
// コマンドラインパラメータの値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
// 環境変数を使用して AccessKey ID と AccessKey シークレットを読み込みます。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルト構成を使用します。
$cfg = Oss\Config::loadDefault();
// 認証プロバイダーを指定します。
$cfg->setCredentialsProvider($credentialsProvider);
// リージョンを指定します。
$cfg->setRegion($region);
// エンドポイントが提供されている場合は、エンドポイントを指定します。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);
// バケットの CORS ルールを構成し、CORS で許可される送信元とリクエストメソッドを指定するために、GetBucketCorsRequest オブジェクトを作成します。
$request = new Oss\Models\PutBucketCorsRequest(bucket: $bucket, corsConfiguration: new Oss\Models\CORSConfiguration(
array(
new Oss\Models\CORSRule(
allowedOrigins: ['*'], // すべての送信元からのクロスオリジンリクエストを許可します。
allowedMethods: ['PUT', 'GET'] // CORS で許可されるリクエストメソッドを指定します。
)
)
)
);
// putBucketCors メソッドを使用して、バケットの CORS 構成を構成します。
$result = $client->putBucketCors($request);
// 返された結果を表示します。
printf(
'status code:' . $result->statusCode . PHP_EOL . // 返された HTTP ステータスコード。
'request id:' . $result->requestId // リクエストのリクエスト ID。リクエストの一意の識別子です。
);
CORS ルールの照会
次のサンプルコードは、バケットの CORS ルールを照会する方法の例を示しています。
<?php
// 依存ライブラリを読み込むために、autoload ファイルを導入します。
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// コマンドラインパラメータの説明を指定します。
$optsdesc = [
"region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
"endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
"bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
];
// Generate a long options list to parse the command line parameters.
$longopts = \array_map(function ($key) {
return "$key:"; // Add a colon (:) to the end of each parameter to indicate that a value is required.
}, array_keys($optsdesc));
// Parse the command line parameters.
$options = getopt("", $longopts);
// Check whether the required parameters are configured.
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help"; // Specify that the required parameters are not configured.
exit(1);
}
}
// Obtain the values of the command line parameters.
$region = $options["region"]; // The region in which the bucket is located.
$bucket = $options["bucket"]; // The name of the bucket.
// Use environment variables to load the AccessKey ID and AccessKey secret.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// Use the default configurations of the SDK.
$cfg = Oss\Config::loadDefault();
// Specify the credential provider.
$cfg->setCredentialsProvider($credentialsProvider);
// Specify the region.
$cfg->setRegion($region);
// Specify the endpoint if an endpoint is provided.
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
// Create an OSSClient instance.
$client = new Oss\Client($cfg);
// Create a GetBucketCorsRequest object to query the CORS configurations of a bucket.
$request = new Oss\Models\GetBucketCorsRequest(bucket: $bucket);
// Use the getBucketCors method to query the CORS configurations of the bucket.
$result = $client->getBucketCors($request);
// Display the returned result.
printf(
'status code:' . $result->statusCode . PHP_EOL . // The returned HTTP status code.
'request id:' . $result->requestId . PHP_EOL . // The request ID of the request, which is the unique identifier of the request.
'cors:' . var_export($result->corsConfiguration, true) // The CORS configurations of the bucket.
);
CORS ルールの削除
次のサンプルコードは、バケットのすべての CORS ルールを削除する方法の例を示しています。
<?php
// 依存ライブラリを読み込むために、autoload ファイルを導入します。
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// コマンドラインパラメータの説明を指定します。
$optsdesc = [
"region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
"endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
"bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
];
// コマンドラインパラメータを解析するための長いオプションリストを生成します。
$longopts = \array_map(function ($key) {
return "$key:"; // 各パラメータの末尾にコロン (:) を追加して、値が必要であることを示します。
}, array_keys($optsdesc));
// コマンドラインパラメータを解析します。
$options = getopt("", $longopts);
// 必須パラメータが構成されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help"; // 必須パラメータが構成されていないことを指定します。
exit(1);
}
}
// コマンドラインパラメータの値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
// 環境変数を使用して AccessKey ID と AccessKey シークレットを読み込みます。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルト構成を使用します。
$cfg = Oss\Config::loadDefault();
// 認証プロバイダーを指定します。
$cfg->setCredentialsProvider($credentialsProvider);
// リージョンを指定します。
$cfg->setRegion($region);
// エンドポイントが提供されている場合は、エンドポイントを指定します。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);
// バケットの CORS 構成を削除するために、DeleteBucketCorsRequest オブジェクトを作成します。
$request = new Oss\Models\DeleteBucketCorsRequest(bucket: $bucket);
// deleteBucketCors メソッドを使用して、バケットの CORS 構成を削除します。
$result = $client->deleteBucketCors($request);
// 返された結果を表示します。
printf(
'status code:' . $result->statusCode . PHP_EOL . // 返された HTTP ステータスコード。
'request id:' . $result->requestId // リクエストのリクエスト ID。リクエストの一意の識別子です。
);
参考資料
CORS の完全なサンプルコードについては、PutBucketCors、GetBucketCors、および DeleteBucketCors をご覧ください。
CORS ルールを構成するために呼び出すことができる API 操作の詳細については、「PutBucketCors」をご参照ください。
CORS ルールを照会するために呼び出すことができる API 操作の詳細については、「GetBucketCors」をご参照ください。
CORS ルールを削除するために呼び出すことができる API 操作の詳細については、「DeleteBucketCors」をご参照ください。