ブラウザは同一オリジンポリシーを適用します。これにより、webページで実行されるJavaScriptコードは、同じオリジンからのみリソースにアクセスし、クロスオリジンリクエストを拒否できます。 クロスオリジンリソース共有 (CORS) を使用すると、webブラウザは、ドメインまたはオリジンから別のドメインまたはオリジンへのリクエストを開始できます。 CORSを使用すると、WebサイトにロードされたJavaScriptコードで、異なるオリジンを持つObject Storage Service (OSS) サーバー上のオブジェクトを正常にリクエストできます。
同一生成元ポリシー
ブラウザは、Webサイトのコンテンツを安全に保つために、同じオリジンポリシーに基づいてクロスオリジンリクエストを拒否します。 たとえば、あるWebサイトのJavaScriptコードが別のWebサイトでホストされているリソースをリクエストした場合、ブラウザはそのリクエストを拒否します。
2つのURLは、プロトコル、ドメイン名またはIPアドレス、およびポート番号 (指定されている場合) が同じ場合、同じオリジンを持ちます。 次の表は、http://www.aliyun.com/org/test.html
との原点比較の例を示しています。
URL | 成功したアクセス | 理由 |
http://www.aliyun.com/org/other.html | 必須 | 同じプロトコル、ドメイン名、ポート番号 |
http://www.aliyun.com/org/internal/page.html | 必須 | 同じプロトコル、ドメイン名、ポート番号 |
https://www.aliyun.com/page.html | 任意 | 異なるプロトコル (HTTPとHTTPS) |
http://www.aliyun.com:22/dir/page.html | 任意 | 異なるポート番号 (22およびポート番号なし) |
http://www.alibabacloud.com/help/other.html | 任意 | 異なるドメイン名 |
上の表は、ブラウザーがURLから別のURLへのリクエストを拒否することを示しています。 クロスオリジンリクエストを許可する場合は、CORSルールを設定する必要があります。
使用上の注意
バケットには最大 10 個の CORS ルールを設定できます。
OSS (Object Storage Service) がバケットを宛先とするクロスオリジンリクエストまたはOPTIONSリクエストを受信すると、OSSはバケットに設定されているCORSルールを読み取り、ルールを次々と照合しようとします。 最初の一致が見つかった場合、OSSは対応するヘッダーを返します。 リクエストがCORSルールと一致しない場合、OSSはレスポンスにCORSヘッダーを含めません。
Alibaba Cloud CDNの有効化後にCORSを実装するには、CDNコンソールでCORSルールを設定する必要があります。 詳細については、以下をご参照ください。 Alibaba Cloud Content Delivery Network HTTPヘッダー (CORS) を使用してクロスオリジンリソース共有を設定する方法
CORSルール
要件に基づいて、クロスオリジンリクエストを許可または拒否するようにCORSルールを設定できます。 CORSルールは、CORS関連のヘッダーをリクエストに追加するかどうかを決定するためにのみ設定されます。 ブラウザは、クロスオリジンリクエストを拒否するかどうかを決定します。
次のいずれかの条件が満たされている場合、ローカルキャッシュエラーを回避するために [Vary: Origin] を選択する必要があります。
Vary: Originを選択した場合、ブラウザからのアクセスまたはCDN back-to-originリクエストが増加する可能性があります。
CORSリクエストと非CORSリクエストは同時に送信されます。
次のサンプルコードは、<img> フィールドで作成されたCORS以外のリクエストと、fetchメソッドを使用して作成されたCORSリクエストの例を示しています。
<!doctype html> <html> <ヘッド> <meta charset="UTF-8"> <title>CORSテスト </title> </head> <body> <! -- CORS以外のリクエスト --> <img src="https://examplebucket.oss-cn-beijing.aliyuncs.com/exampleobject.txt" alt=""> <スクリプト> <! -- CORSリクエスト --> fetch("https://examplebucket.oss-cn-beijing.aliyuncs.com/exampleobject.txt").then(console.log) </script> </body> </html>
Originヘッダーには複数の可能な値があります
たとえば、Originヘッダーを
http://www.example.com
およびhttps://www.example.org
に設定して、これらのオリジンからのCORSリクエストを許可します。
手順
OSSコンソールの使用
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、バケットリスト をクリックします。 [バケット] ページで、目的のバケットを見つけてクリックします。
左側のナビゲーションツリーで、コンテンツセキュリティ > クロスオリジンリソース共有の設定 を選択します。
クロスオリジンリソース共有の設定ページで、ルールの作成 をクリックします。
ルールの作成 パネルで、パラメーターを設定します。 次の表にパラメーターを示します。
パラメーター
必須
説明
ソース
必須
クロスオリジンリクエストが許可されるオリジン。 このパラメーターを設定するときは、次の項目に注意してください。
複数の許可されたオリジンを指定できます。 複数の原点をラインフィードで区切ります。
オリジンURLには、HTTPやHTTPSなどのプロトコルを含める必要があります。
オリジンURLのワイルドカード文字としてアスタリスク (*) を使用できます。 各オリジンには、最大1つのアスタリスク (*) を含めることができます。
オリジンURLがデフォルトのポート番号を使用しない場合は、実際のポート番号を指定します。 例:
https://www.example.com:8080
。
次の例は、許可されたオリジンを設定する方法を示します。
特定のオリジンからのリクエストを許可するには、オリジンURLを指定します。 例:
https://www.example.com
。特定のルートドメインのサブドメインからのリクエストを許可するには、オリジンURLでアスタリスク (*) ワイルドカード文字を使用します。 例:
https:// * .example.com
すべてのオリジンからのリクエストを許可するには、アスタリスク (*) ワイルドカード文字のみを入力します。
メソッド
必須
クロスオリジンリクエストが使用できるメソッド。
許可されたヘッダー
任意
クロスオリジンリクエストで許可されているヘッダー。 ヘッダーを設定するときは、次の項目に注意してください。
このパラメーターの値はkey:value形式であり、大文字と小文字は区別されません。 例:
content-type:text/plain
複数のヘッダーを設定できます。 複数のヘッダーを改行で区切ります。
ワイルドカード文字としてアスタリスク (*) を使用できます。 各ヘッダーには、最大1つのアスタリスク (*) を含めることができます。 特別な要件がない場合は、このパラメーターをアスタリスク (*) に設定します。
公開ヘッダー
任意
JavaScriptのXMLHttpRequestオブジェクトなど、アプリケーションからのリクエストに使用できるレスポンスヘッダー。 公開されたヘッダーには、アスタリスク (*) ワイルドカード文字を含めることはできません。
次の一般的な公開ヘッダーを設定することを推奨します。
x-oss-request-id
問題が発生した場合は、トラブルシューティングのリクエストIDをテクニカルサポートに提供します。
ETag
オブジェクトのETag値を使用して、オブジェクトの内容が変更されているかどうかを確認できます。
キャッシュ時間(秒)
任意
ブラウザが特定のリソースのOPTIONSプリフライト要求に対する応答をキャッシュできる期間。 単位は秒です。
Vary: Origin
任意
Vary: Origin
ヘッダーを返すかどうかを指定します。CORSリクエストと非CORSリクエストの両方がOSSに送信される場合、またはOriginヘッダーに複数の値がある場合は、ローカルキャッシュのエラーを防ぐためにVary: Originを選択することを推奨します。
重要Vary: Originを選択した場合、ブラウザからのアクセスまたはCDN back-to-originリクエストが増加する可能性があります。
OK をクリックします。
OSS SDKの使用
次のコードは、一般的なプログラミング言語でOSS SDKを使用してCORSルールを設定する方法の例を示しています。 他のプログラミング言語でOSS SDKを使用してCORSルールを設定する方法の詳細については、「概要」をご参照ください。
com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo del.SetBucketCORSRequestをインポートします。java.util.ArrayListをインポートします。public classデモ {
public static void main(String[] args) throws Exception {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。 例: examplebucket.
String bucketName = "examplebucket";
// Create an OSSClient instance.
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
SetBucketCORSRequest request = new SetBucketCORSRequest(bucketName);
// バケットに最大10個のCORSルールを設定できます。
ArrayList<SetBucketCORSRequest.CORSRule> putCorsRules = new ArrayList<SetBucketCORSRequest.CORSRule>();
SetBucketCORSRequest.CORSRule corRule = new SetBucketCORSRequest.CORSRule();
ArrayList<String> allowedOrigin = new ArrayList<String>();
// クロスオリジンリクエストを許可するオリジンを指定します。
allowedOrigin.add( "http://example.com");
ArrayList<String> allowedMethod = new ArrayList<String>();
// GET、PUT、DELETE、POST、HEADなど、クロスオリジンリクエストの送信に使用できるメソッドを指定します。
allowedMethod.add("GET");
ArrayList<String> allowedHeader = new ArrayList<String>();
// OPTIONSプリフライト要求のAccess-Control-Request-headersで指定されているヘッダーを許可するかどうかを指定します。
allowedHeader.add("x-oss-test");
ArrayList<String> exposedHeader = new ArrayList<String>();
// アプリケーションからの許可されたアクセス要求のレスポンスヘッダーを指定します。
exposedHeader.add("x-oss-test1");
// CORSルールでAllowedOriginsとAllowedMethodsのワイルドカード文字として使用できるアスタリスク (*) は1つだけです。 アスタリスク (*) ワイルドカード文字は、すべてのオリジンまたは操作が許可されることを指定します。
corRule.setAllowedMethods(allowedMethod);
corRule.setAllowedOrigins(allowedOrigin);
// AllowedHeadersとExposeHeadersはワイルドカード文字をサポートしていません。
corRule.setAllowedHeaders(allowedHeader);
corRule.setExposeHeaders(exposedHeader);
// 特定のリソースに対するOPTIONSプリフライト要求の応答をブラウザがキャッシュできる期間を指定します。 単位は秒です。
corRule.setMaxAgeSeconds(10);
// バケットには最大10個のCORSルールを設定できます。
putCorsRules.add(corRule);
// 既存のCORSルールが上書きされます。
request.setCorsRules(putCorsRules);
// "Vary: Origin" ヘッダーを返すかどうかを指定します。 このパラメーターをTRUEに設定すると、リクエストがクロスオリジンリクエストであるかどうか、またはクロスオリジンリクエストが成功したかどうかに関係なく、Vary: Originヘッダーが返されます。 このパラメーターをFalseに設定すると、Vary: Originヘッダーは返されません。
// request.setResponseVary(Boolean.TRUE);
ossClient.setBucketCORS(request);
} catch (Exception e) {
System.out.println("Caught an OSSException, which means your request made it to 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 e) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ 「ネットワークにアクセスできないなど」;
System.out.println("エラーメッセージ:" + ce.getMessage());
} 最後に{
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
<?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';
}
OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。OSS\Model\CorsConfigを使用します。OSS\Model\CorsRuleを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
$end point = "https://oss-cn-hangzhou.aliyuncs.com";
// バケットの名前を指定します。 例: examplebucket.
$bucket= "examplebucket";
$corsConfig = new CorsConfig();
$rule = new CorsRule();
// クロスオリジンリクエストを許可するレスポンスヘッダーを指定します。 複数の許可されたヘッダーを指定できます。 許可されたヘッダーごとにワイルドカード文字として使用できるアスタリスク (*) は1つだけです。
// 特別な要件がない場合は、AllowedHeaderをアスタリスク (*) に設定することを推奨します。
$rule->addAllowedHeader("*");
// アプリケーションからアクセスできるレスポンスヘッダーを指定します。 複数の公開ヘッダーを指定できます。 公開ヘッダーにアスタリスク (*) を含めることはできません。
$rule->addExposeHeader("x-oss-header");
// クロスオリジンリクエストが送信される許可されたオリジンを指定します。 複数の許可されたオリジンを指定できます。 許可された各オリジンのワイルドカード文字として使用できるアスタリスク (*) は1つだけです。
$rule->addAllowedOrigin("https://example.com:8080");
$rule->addAllowedOrigin("https:// * .aliyun.com");
// AllowedOriginをアスタリスク (*) に設定すると、すべてのオリジンからのリクエストが許可されます。
//$rule->addAllowedOrigin("*");
// クロスオリジンリクエストが使用できるHTTPメソッドを指定します。
$rule->addAllowedMethod("POST");
// ブラウザが特定のリソースへのプリフライト (OPTIONS) 要求に対する応答をキャッシュできる時間を指定します。 単位は秒です。
$rule->setMaxAgeSeconds(10);
// バケットごとに最大10個のルールを追加できます。
$corsConfig->addRule($rule);
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
// OSSは、リクエストで作成するCORSルールと同じ名前の既存のCORSルールを上書きします。
$ossClient->putBucketCors($bucket、$corsConfig);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage()) 。 "\n");
戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n");
const OSS = require('ali-OSS ');
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。
リージョン: 'yourRegion' 、
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、環境変数OSS_ACCESS_KEY_IDとOSS_ACCESS_KEY_SECRETが設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID、
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
// バケットの名前を指定します。
bucket: 'yourBucket'
});
const rules = [{
// 許可されるクロスオリジンリクエストのオリジンを指定します。 オリジンをアスタリスク (*) に設定して、すべてのリージョンからのリクエストを許可できます。
allowedOrigin: 'http:// example.com '、
// GET、PUT、DELETE、POST、HEADなど、クロスオリジンリクエストの送信に使用できるメソッドを指定します。
allowedMethod: 'GET' 、
// クロスオリジンリクエストを許可するレスポンスヘッダーを指定します。 特に指定がない限り、値としてアスタリスク (*) を使用することを推奨します。
allowedHeader: '*' 、
// JavaScriptのXMLHttpRequestオブジェクトなど、アプリケーションからの許可されたアクセス要求のレスポンスヘッダーを指定します。 アスタリスク (*) はサポートされていません。
exposeHeader: 'Content-Length' 、
// 特定のリソースに対するOPTIONSプリフライト要求に対する応答をブラウザがキャッシュできる期間を指定します。 単位は秒です。
maxAgeSeconds: '30'
},
];
// 最大10個のCORSルールを設定できます。 既存のルールと同じ新しいルールが設定されている場合、既存のルールは上書きされます。
client.putBucketCORS("yourBucket", rules).then((r) => {
console.log(r);
});
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
oss2.modelsからBucketCors、CorsRuleをインポート
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、環境変数OSS_ACCESS_KEY_IDとOSS_ACCESS_KEY_SECRETが設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
# バケットの名前を指定します。 例: examplebucket.
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
rule = CorsRule(allowed_origins=['*']) 、
allowed_methods=['GET', 'HEAD'],
allowed_headers=['*'],
max_age_seconds=1000)
# 同じ名前の既存のルールが上書きされます。
Aliyun.OSSを使用したbucket.put_bucket_cors(BucketCors([ルール]))
;
Aliyun.OSS.Common; を使用
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケットの名前を指定します。 例: examplebucket.
var bucketName = "examplebucket";
// OSSClientインスタンスを作成します。
var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
トライ
{
var request = new SetBucketCorsRequest(bucketName);
var rule1 = new CORSRule();
// クロスオリジンリクエストを許可するオリジンを指定します。
rule1.AddAllowedOrigin("http://example.com");
// GET、PUT、DELETE、POST、HEADなど、クロスオリジンリクエストの送信に使用できるメソッドを指定します。
rule1.AddAllowedMethod("POST");
// AllowedHeadersとExposeHeadersはワイルドカード文字をサポートしていません。
rule1.AddAllowedHeader("*");
// アプリケーションからの許可されたアクセス要求のレスポンスヘッダーを指定します。
rule1.AddExposeHeader("x-oss-test");
// バケットに最大10個のCORSルールを設定できます。
request.AddCORSRule(rule1);
var rule2 = new CORSRule();
// CORSルールでAllowedOriginsとAllowedMethodsのワイルドカード文字として使用できるアスタリスク (*) は1つだけです。 アスタリスク (*) ワイルドカード文字は、すべてのオリジンまたは操作が許可されることを指定します。
rule2.AddAllowedOrigin("http://example.net");
rule2.AddAllowedMethod("GET");
// OPTIONSプリフライト要求のAccess-Control-Request-headersで指定されているヘッダーを許可するかどうかを指定します。
rule2.AddExposeHeader("x-oss-test2");
// 特定のリソースに対するOPTIONSプリフライト要求の応答をブラウザがキャッシュできる期間を指定します。 単位は秒です。
rule2.MaxAgeSeconds = 100;
request.AddCORSRule(rule2);
// CORSルールを設定します。
client.SetBucketCors(request);
Console.WriteLine("Set bucket:{0} Cors successed", bucketName);
}
キャッチ (OssException ex)
{
Console.WriteLine("エラー情報で失敗: {0}; エラー情報: {1} 。 \nRequestID:{2}\tHostID:{3}"、
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
キャッチ (例外ex)
{
Console.WriteLine("Failed with error info: {0}" 、メッセージなど);
}
パッケージメイン
import (import (import)
"fmt"
「github.com/aliyun/aliyun-oss-go-sdk/oss」
"os"
)
func main() {
// バケットの名前を指定します。
bucketName := "yourBucketName"
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// OSSClientインスタンスを作成します。
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。
client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
isTrue := true
rule1 := oss.CORSRule {
AllowedOrigin: []string{"*"} 、AllowedMethod: []string{"PUT", "GET", "POST"},
AllowedHeader: []string {},
ExposeHeader: []string {},
MaxAgeSeconds: 100、}
rule2 := oss.CORSRule {
AllowedOrigin: []string{"http://www.a.com", "http://www.b.com"},
AllowedMethod: []string{"GET"} 、AllowedHeader: []string{"Authorization"},
ExposeHeader: []string{"x-oss-test-01" 、"x-oss-test-02"} 、MaxAgeSeconds: 100、}
put := oss.PutBucketCORS{}
put.CORSRules = []oss.CORSRule{rule1,rule2}
put.ResponseVary = &isTrue
// CORSルールを作成します。
err = client.SetBucketCORSV2(bucketName, put)
if err! =nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println (「セット成功」)
}
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
/* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットの名前を指定します。 例: examplebucket. */
std::string BucketName = "examplebucket";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClientクライアント (Endpoint, credentialsProvider, conf);
SetBucketCorsRequestリクエスト (BucketName);
/* CORSルールを設定します。 */
auto rule1 = CORSRule();
/* クロスオリジンリクエストを許可するオリジンを指定します。 */
rule1.addAllowedOrigin("http://example.com");
/* GET、PUT、POST、DELETE、HEADなど、クロスオリジンリクエストの送信に使用できるメソッドを指定します。 */
rule1.addAllowedMethod("POST");
/* OPTIONSプリフライト要求のAccess-Control-Request-headersで指定されているヘッダーを許可するかどうかを指定します。 */
rule1.addAllowedHeader("*");
/* アプリケーションからの許可されたアクセス要求の応答ヘッダーを指定します。 */
rule1.addExposeHeader("x-oss-test");
/* バケットには最大10個のCORSルールを設定できます。 */
request.addCORSRule(rule1);
auto rule2 = CORSRule();
rule2.addAllowedOrigin("http://example.net");
rule2.addAllowedMethod("GET");
rule2.addExposeHeader("x-oss-test2");
rule2.setMaxAgeSeconds(100);
request.addCORSRule(rule2);
auto outcome = client.SetBucketCors (リクエスト);
if (!outcome.isSuccess()) {
/* 例外を処理します。 */
std::cout << "SetBucketCors fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
0を返します。}
#include "oss_api.h"
# 「aos_http_io.h」を含める
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 * /
const char * endpoint = "yourEndpoint";
/* バケットの名前を指定します。 例: examplebucket. * /
const char * bucket_name = "examplebucket";
void init_options(oss_request_options_t * オプション)
{
options->config = oss_config_create(options->pool);
/* char * stringを使用して、aos_string_t型のデータを初期化します。 */
aos_str_set(&options->config->endpoint, endpoint);
/* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
/* CNAMEを使用するかどうかを指定します。 値0は、CNAMEが使用されないことを示す。 */
options->config->is_cname = 0;
/* タイムアウト時間などのネットワークパラメーターを指定します。 */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char * argv[])
{
/* main() でaos_http_io_initializeメソッドを呼び出して、ネットワークリソースやメモリリソースなどのグローバルリソースを初期化します。 */
if (aos_http_io_initialize(NULL, 0))! =AOSE_OK) {
exit(1);
}
/* メモリを管理するためのメモリプールを作成します。 aos_pool_tはapr_pool_tと同じです。 メモリプールの作成に使用されるコードは、APRライブラリに含まれています。 */
aos_pool_t *pool;
/* メモリプールを作成します。 2番目のパラメーターの値はNULLです。 この値は、プールが他のメモリプールを継承しないことを示します。 */
aos_pool_create(&pool, NULL);
/* Create and initialize options. このパラメーターには、エンドポイント、access_key_id、access_key_secret、is_cname、curlなどのグローバル構成情報が含まれます。 */
oss_request_options_t *oss_client_options;
/* メモリプール内のメモリリソースをオプションに割り当てます。 */
oss_client_options = oss_request_options_create(pool);
/* oss_client_optionsを初期化します。 */
init_options(oss_client_options);
/* パラメーターを初期化します。 */
aos_string_t bucket;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_list_t cors_rule_list;
oss_cors_rule_t *cors_rule1 = NULL, *cors_rule2 = NULL;
aos_str_set(&bucket, bucket_name);
aos_list_init(&cors_rule_list);
cors_rule1 = oss_create_cors_rule(pool);
aos_list_add_tail(&cors_rule1->node, &cors_rule_list);
oss_create_sub_cors_rule(pool, &cors_rule1->allowed_origin_list, "allowed_origin_1_1");
oss_create_sub_cors_rule(pool, &cors_rule1->allowed_origin_list, "allowed_origin_1_1");
oss_create_sub_cors_rule(pool, &cors_rule1->allowed_method_list, "PUT");
oss_create_sub_cors_rule(pool, &cors_rule1->allowed_method_list, "GET");
oss_create_sub_cors_rule(pool, &cors_rule1->allowed_head_list, "Authorization");
oss_create_sub_cors_rule(pool, &cors_rule1->expose_head_list, "expose_head_1_1");
oss_create_sub_cors_rule(pool, &cors_rule1->expose_head_list, "expose_head_1_1");
cors_rule2 = oss_create_cors_rule(pool);
aos_list_add_tail(&cors_rule2->node, &cors_rule_list);
oss_create_sub_cors_rule(pool, &cors_rule2->allowed_origin_list, "allowed_origin_2_1");
oss_create_sub_cors_rule(pool, &cors_rule2->allowed_origin_list, "allowed_origin_2_2");
oss_create_sub_cors_rule(pool, &cors_rule2->allowed_method_list, "PUT");
oss_create_sub_cors_rule(pool, &cors_rule2->allowed_method_list, "GET");
oss_create_sub_cors_rule(pool, &cors_rule2->allowed_head_list, "Authorization");
oss_create_sub_cors_rule(pool, &cors_rule2->expose_head_list, "expose_head_2_1");
oss_create_sub_cors_rule(pool, &cors_rule2->expose_head_list, "expose_head_2_2");
/* CORSルールを設定します。 */
resp_status = oss_put_bucket_cors(oss_client_options, &bucket, &cors_rule_list, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("put bucket cors succeeded\n");
} else {
printf("put bucket cors failed\n");
}
/* メモリプールを解放します。 この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
0を返します。}
'aliyun/oss' が必要です
client = Aliyun::OSS::Client.new (
# この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
エンドポイント: 'https:// oss-cn-hangzhou.aliyuncs.com '、
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
access_key_id: ENV['OSS_ACCESS_KEY_ID '] 、
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET ']
)
# バケットの名前を指定します。 例: examplebucket.
bucket = client.get_bucket('examplebucket')
# CORSルールを設定します。
bucket.cors = [
Aliyun::OSS::CORSRule.new (
# クロスオリジンリクエストを許可するオリジンを指定します。 例: http://example.com。
: allowed_origins => ['http:// example.com '、'http:// example.net'] 、
# GET、PUT、DELETE、POST、HEADなど、クロスオリジンリクエストの送信に使用できるメソッドを指定します。
: allowed_methods => ['PUT', 'POST', 'GET'] 、
# OPTIONSプリフライトリクエストで許可されるヘッダーを指定します。 例: x-oss-test。
: allowed_headers => ['x-oss-test'] 、
# アプリケーションからの許可されたアクセス要求のレスポンスヘッダーを指定します。
: expose_headers => ['x-oss-test1 '] 、
# 特定のリソースに対するOPTIONSプリフライト要求の応答をブラウザがキャッシュできる期間を指定します。 単位は秒です。
: max_age_seconds => 100)
]
ossutilの使用
ossutilを使用してCORSルールを設定する方法の詳細については、「cors」をご参照ください。
OSS APIの使用
ビジネスで高度なカスタマイズが必要な場合は、RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳細は、「PutBucketcors」 をご参照ください。
よくある質問
「No 'Access-Control-Allow-Origin' 」エラーが報告された場合はどうすればよいですか?
エラーの原因と解決策の詳細については、「」をご参照ください。 CORSルールの設定後にOSSを呼び出すと、「No 'Access-Control-Allow-Origin' 」エラーが発生します。
CDN高速化ドメイン名を使用してOSSにアクセスすると、CORSエラーが発生した場合はどうすればよいですか。
CDN高速化ドメイン名を使用してOSSにアクセスするときにCORSエラーが発生した場合は、Alibaba Cloud CDNコンソールでCORSルールを設定する必要があります。 詳細については、以下をご参照ください。 CORSの設定
クロスオリジンリクエストを送信するときにAccess-Control-Allow-Originヘッダーをアスタリスク (*) にできないことを示すエラーが報告された場合はどうすればよいですか?
preflightリクエストへの応答がアクセス制御チェックに合格しない場合: リクエストの資格情報モードが「include」の場合、応答の「access-control-Allow-Origin」ヘッダーの値はワイルドカード「 * 」ではありません。
Access-Control-Allow-Origin
の値を特定のURLに変更するか、コードにxhr.withCredentials = false;
を指定してエラーを修正します。 詳細については、「Access-Control-Allow-originをアスタリスク (*) にできないことを示すクロスオリジンリクエストエラーの修正方法」をご参照ください。
同じバケットの2つのCORSルールがリクエストに同時に適用できないのはなぜですか?
2つのCORSルールを設定すると、OSSは順番にルールと一致します。 OSSが最初の一致を見つけた後、OSSは対応するヘッダーを返します。