オリジン間リソース共有 (CORS) により、Web アプリケーションは異なるオリジンからリソースにアクセスできます。Object Storage Service (OSS) は、クロスオリジンアクセスの権限をコントロールするための CORS の API 操作を提供します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成する場合は、「OssClient の作成」をご参照ください。
CORS ルールを設定するには、
oss:PutBucketCors権限が必要です。CORS ルールを取得するには、oss:GetBucketCors権限が必要です。CORS ルールを削除するには、oss:DeleteBucketCors権限が必要です。詳細については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。
CORS ルールの設定
次のコードは、examplebucket バケットの CORS ルールを設定する方法の例を示しています。
<?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;
use OSS\Model\CorsConfig;
use OSS\Model\CorsRule;
// 環境変数からアクセス認証情報を取得します。このコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// endpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// bucket を、ご使用のバケット名 (例: examplebucket) に設定します。
$bucket= "examplebucket";
$corsConfig = new CorsConfig();
$rule = new CorsRule();
// クロスオリジンリクエストで許可されるレスポンスヘッダーを設定します。複数の AllowedHeader 値を設定できます。各値には、最大 1 つのアスタリスク (*) ワイルドカードを含めることができます。
// 特別な要件がない場合は、AllowedHeader をアスタリスク (*) に設定します。
$rule->addAllowedHeader("*");
// ユーザーがアプリケーションからアクセスできるレスポンスヘッダーを設定します。複数の ExposeHeader 値を設定できます。ExposeHeader ではアスタリスク (*) ワイルドカードはサポートされていません。
$rule->addExposeHeader("x-oss-header");
// クロスオリジンリクエストで許可されるオリジンを設定します。複数の AllowedOrigin 値を設定できます。各値には、最大 1 つのアスタリスク (*) ワイルドカードを含めることができます。
$rule->addAllowedOrigin("https://example.com:8080");
$rule->addAllowedOrigin("https://*.aliyun.com");
// すべてのオリジンからのリクエストを許可するには、AllowedOrigin をアスタリスク (*) に設定します。
//$rule->addAllowedOrigin("*");
// クロスオリジンリクエストで許可されるメソッドを設定します。
$rule->addAllowedMethod("POST");
// プリフライト (OPTIONS) リクエストへのレスポンスのキャッシュ期間を設定します。単位は秒です。
$rule->setMaxAgeSeconds(10);
// 各バケットには最大 10 個のルールを追加できます。
$corsConfig->addRule($rule);
// Vary: Origin ヘッダーを返すかどうかを指定します。これを false に設定すると、Vary: Origin ヘッダーは返されません。
$corsConfig->setResponseVary(false);
try{
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// 既存のルールは上書きされます。
$ossClient->putBucketCors($bucket, $corsConfig);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n"); CORS ルールの取得
次のコードは、examplebucket バケットの CORS ルールを取得する方法の例を示しています。
<?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\Core\OssException;
try {
// 環境変数からアクセス認証情報を取得し、プロバイダーに保存します。このコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// endpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// bucket を、ご使用のバケット名 (例: examplebucket) に設定します。
$bucket= "examplebucket";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
$corsConfig = $ossClient->getBucketCors($bucket);
if ($corsConfig->getResponseVary()){
printf("Response Vary : true" .PHP_EOL);
}else{
printf("Response Vary : false" .PHP_EOL);
}
foreach ($corsConfig->getRules() as $key => $rule){
if($rule->getAllowedHeaders()){
foreach($rule->getAllowedHeaders() as $header){
printf("Allowed Headers :" .$header .PHP_EOL);
}
}
if ($rule->getAllowedMethods()){
foreach($rule->getAllowedMethods() as $method){
printf("Allowed Methods :" .$method . PHP_EOL);
}
}
if($rule->getAllowedOrigins()){
foreach($rule->getAllowedOrigins() as $origin){
printf("Allowed Origins :" .$origin , PHP_EOL);
}
}
if($rule->getExposeHeaders()){
foreach($rule->getExposeHeaders() as $exposeHeader){
printf("Expose Headers :" .$exposeHeader . PHP_EOL);
}
}
printf("Max Age Seconds :" .$rule->getMaxAgeSeconds() .PHP_EOL);
}
} catch (OssException $e) {
printf($e->getMessage() . "\n");
return;
}
CORS ルールの削除
次のコードは、examplebucket バケットからすべての CORS ルールを削除する方法の例を示しています。
<?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();
// endpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// bucket を、ご使用のバケット名 (例: examplebucket) に設定します。
$bucket= "examplebucket";
try{
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
$ossClient->deleteBucketCors($bucket);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n"); 関連ドキュメント
CORS ルールを管理するための完全なサンプルコードについては、「GitHub」をご参照ください。
CORS ルールを設定するための API 操作の詳細については、「PutBucketCors」をご参照ください。
CORS ルールを取得するための API 操作の詳細については、「GetBucketCors」をご参照ください。
CORS ルールを削除するための API 操作の詳細については、「DeleteBucketCors」をご参照ください。