日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

OSS設(shè)置跨域資源共享CORS

更新時(shí)間: 2024-06-25 10:10:11

默認(rèn)情況下,由于同源策略(Same-Origin Policy)的限制,網(wǎng)頁(yè)瀏覽器在執(zhí)行JavaScript時(shí)會(huì)限制跨域請(qǐng)求,只允許請(qǐng)求同一域或源的資源。跨域資源共享CORS(Cross-Origin Resource Sharing)簡(jiǎn)稱(chēng)跨域訪問(wèn),允許網(wǎng)頁(yè)瀏覽器向不同域或源的服務(wù)器發(fā)起跨域請(qǐng)求。通過(guò)跨域設(shè)置可以實(shí)現(xiàn)在您的網(wǎng)站上使用JavaScript請(qǐng)求非同源的OSS對(duì)象鏈接而不會(huì)出現(xiàn)跨域問(wèn)題。

同源檢測(cè)

跨域訪問(wèn)是瀏覽器出于安全考慮而設(shè)置的一個(gè)限制,即同源策略,是用于隔離潛在惡意文件的關(guān)鍵安全機(jī)制。當(dāng)A、B兩個(gè)網(wǎng)站屬于不同域時(shí),來(lái)自于A網(wǎng)站頁(yè)面中的JavaScript代碼訪問(wèn)B網(wǎng)站時(shí),瀏覽器會(huì)拒絕該訪問(wèn)。

同協(xié)議、同域名(或IP)以及同端口視為同域。兩個(gè)頁(yè)面的協(xié)議、域名和端口(如果指定了端口)相同,則視為同源。下表給出了相對(duì)http://www.aliyun.com/org/test.html的同源檢測(cè)示例:

URL

訪問(wèn)是否成功

原因

http://www.aliyun.com/org/other.html

協(xié)議、域名、端口相同

http://www.aliyun.com/org/internal/page.html

協(xié)議、域名、端口相同

https://www.aliyun.com/page.html

協(xié)議不同(HTTPS)

http://www.aliyun.com:22/dir/page.html

端口不同(22)

http://bestwisewords.com/dir/other.html

域名不同

從上表中可以看出,協(xié)議、域名或者端口不同的情況下,瀏覽器會(huì)拒絕該來(lái)源的訪問(wèn)。如果要允許這些來(lái)源的訪問(wèn),需要設(shè)置跨域規(guī)則。

注意事項(xiàng)

  • 每個(gè)Bucket最多可以配置20條跨域規(guī)則。

  • 當(dāng)OSS收到一個(gè)跨域請(qǐng)求(或者OPTIONS請(qǐng)求)時(shí),會(huì)讀取Bucket對(duì)應(yīng)的CORS規(guī)則,然后進(jìn)行相應(yīng)的權(quán)限檢查。OSS會(huì)依次檢查每一條規(guī)則,使用第一條匹配的規(guī)則來(lái)允許請(qǐng)求并返回對(duì)應(yīng)的Header。如果所有規(guī)則都匹配失敗,則不附加任何CORS相關(guān)的Header。

  • 如果您開(kāi)啟了CDN加速,并且需要進(jìn)行跨域訪問(wèn)時(shí),您需要在CDN控制臺(tái)配置跨域規(guī)則。具體步驟,請(qǐng)參見(jiàn)CDN如何配置跨域資源共享(CORS)

CORS規(guī)則

OSS支持根據(jù)需求靈活配置CORS規(guī)則,實(shí)現(xiàn)允許或者拒絕相應(yīng)的跨域請(qǐng)求。CORS規(guī)則僅用來(lái)決定是否附加CORS相關(guān)的Header,是否攔截跨域請(qǐng)求由瀏覽器決定。

以下兩種情況需選中返回Vary: Origin以避免本地緩存錯(cuò)亂。

重要

選中返回Vary: Origin后,可能會(huì)造成瀏覽器訪問(wèn)次數(shù)或者CDN回源次數(shù)增加。

  • 同時(shí)存在CORS和非CORS請(qǐng)求

    例如實(shí)際請(qǐng)求中在<img>標(biāo)簽下發(fā)起非CORS請(qǐng)求,在fetch下發(fā)起CORS請(qǐng)求。

    <!doctype html>
    <html>
    <head>
     <meta charset="UTF-8">
     <title>CORS Test</title>
    </head>
    <body>
    <!--非CORS請(qǐng)求-->
    <img src="https://examplebucket.oss-cn-beijing.aliyuncs.com/exampleobject.txt" alt="">
    <script>
      <!--CORS請(qǐng)求-->
     fetch("https://examplebucket.oss-cn-beijing.aliyuncs.com/exampleobject.txt").then(console.log)
    </script>
    </body>
    </html>
  • Origin頭存在多種可能值

    例如實(shí)際應(yīng)用中指定允許的跨域請(qǐng)求來(lái)源Origin頭為http://www.example.com以及https://www.example.org

操作步驟

使用OSS控制臺(tái)

  1. 登錄OSS管理控制臺(tái)

  2. 單擊Bucket 列表,然后單擊目標(biāo)Bucket名稱(chēng)。

  3. 在左側(cè)導(dǎo)航欄,選擇數(shù)據(jù)安全 > 跨域設(shè)置

  4. 跨域設(shè)置頁(yè)面,單擊創(chuàng)建規(guī)則

  5. 創(chuàng)建跨域規(guī)則面板,按以下說(shuō)明設(shè)置跨域規(guī)則。

    參數(shù)

    是否必須

    說(shuō)明

    來(lái)源

    指定允許的跨域請(qǐng)求的來(lái)源。配置規(guī)則如下:

    • 允許多條匹配規(guī)則,多條規(guī)則需換行填寫(xiě)。

    • 域名需包含協(xié)議名,例如HTTP、HTTPS。

    • 支持通配符星號(hào)(*),每條匹配規(guī)則最多允許使用一個(gè)星號(hào)(*)。

    • 如果域名使用的不是默認(rèn)端口,還需要攜帶端口號(hào)。例如https://www.example.com:8080

    域名配置示例如下:

    • 匹配指定域名時(shí),填寫(xiě)完整域名,例如https://www.example.com。

    • 匹配泛二級(jí)域名,可使用通配符星號(hào)(*)。例如https://*.example.com。

    • 匹配所有域名,可直接填寫(xiě)通配符星號(hào)(*)。

    允許 Methods

    指定允許的跨域請(qǐng)求方法。

    允許 Headers

    指定允許跨域請(qǐng)求的響應(yīng)頭。配置規(guī)則如下:

    • 格式為key:value,例如content-type:text/plain,大小寫(xiě)不敏感。

    • 允許多條匹配規(guī)則,多條規(guī)則需換行填寫(xiě)。

    • 支持通配符星號(hào)(*),每條匹配規(guī)則最多允許使用一個(gè)星號(hào)(*)。建議沒(méi)有特殊需求的情況下設(shè)置為星號(hào)(*)。

    暴露 Headers

    指定允許用戶從應(yīng)用程序中訪問(wèn)的響應(yīng)頭,例如一個(gè)JavaScript的XMLHttpRequest對(duì)象。不允許使用星號(hào)(*)通配符。

    建議暴露的常見(jiàn)Headers如下:

    • x-oss-request-id

      在您使用OSS服務(wù)遇到問(wèn)題時(shí),請(qǐng)憑借此Request ID請(qǐng)求技術(shù)支持協(xié)助排查并解決您遇到的問(wèn)題。

    • ETag

      可用于檢查Object內(nèi)容是否發(fā)生變化。

    緩存時(shí)間(秒)

    指定瀏覽器對(duì)特定資源的預(yù)取(OPTIONS)請(qǐng)求返回結(jié)果的緩存時(shí)間,單位為秒。

    返回 Vary: Origin

    配置是否返回Vary: Origin Header

    如果實(shí)際應(yīng)用中同時(shí)存在CORS和非CORS請(qǐng)求,或者Origin頭有多種可能值時(shí),建議選中返回 Vary: Origin以避免本地緩存錯(cuò)亂。

    重要

    選中返回 Vary: Origin后,可能會(huì)造成瀏覽器訪問(wèn)次數(shù)或者CDN回源次數(shù)增加。

  6. 單擊確定

使用阿里云SDK

以下僅列舉常見(jiàn)SDK的跨域設(shè)置的代碼示例。關(guān)于其他SDK的跨域設(shè)置的代碼示例,請(qǐng)參見(jiàn)SDK簡(jiǎn)介

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.SetBucketCORSRequest;
import java.util.ArrayList;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
        String bucketName = "examplebucket";

        // 創(chuàng)建OSSClient實(shí)例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            SetBucketCORSRequest request = new SetBucketCORSRequest(bucketName);

            // 每個(gè)存儲(chǔ)空間最多允許設(shè)置10條跨域規(guī)則。
            ArrayList<SetBucketCORSRequest.CORSRule> putCorsRules = new ArrayList<SetBucketCORSRequest.CORSRule>();

            SetBucketCORSRequest.CORSRule corRule = new SetBucketCORSRequest.CORSRule();

            ArrayList<String> allowedOrigin = new ArrayList<String>();
            // 指定允許跨域請(qǐng)求的來(lái)源。
            allowedOrigin.add( "http://example.com");

            ArrayList<String> allowedMethod = new ArrayList<String>();
            // 指定允許的跨域請(qǐng)求方法(GET/PUT/DELETE/POST/HEAD)。
            allowedMethod.add("GET");

            ArrayList<String> allowedHeader = new ArrayList<String>();
            // 是否允許預(yù)取指令(OPTIONS)中Access-Control-Request-Headers頭中指定的Header。
            allowedHeader.add("x-oss-test");

            ArrayList<String> exposedHeader = new ArrayList<String>();
            // 指定允許用戶從應(yīng)用程序中訪問(wèn)的響應(yīng)頭。
            exposedHeader.add("x-oss-test1");
            // AllowedOrigins和AllowedMethods最多支持一個(gè)星號(hào)(*)通配符。星號(hào)(*)表示允許所有的域來(lái)源或者操作。
            corRule.setAllowedMethods(allowedMethod);
            corRule.setAllowedOrigins(allowedOrigin);
            // AllowedHeaders和ExposeHeaders不支持通配符。
            corRule.setAllowedHeaders(allowedHeader);
            corRule.setExposeHeaders(exposedHeader);
            // 指定瀏覽器對(duì)特定資源的預(yù)取(OPTIONS)請(qǐng)求返回結(jié)果的緩存時(shí)間,單位為秒。
            corRule.setMaxAgeSeconds(10);

            // 最多允許10條規(guī)則。
            putCorsRules.add(corRule);
            // 已存在的規(guī)則將被覆蓋。
            request.setCorsRules(putCorsRules);
            // 指定是否返回Vary: Origin頭。指定為T(mén)RUE,表示不管發(fā)送的是否為跨域請(qǐng)求或跨域請(qǐng)求是否成功,均會(huì)返回Vary: Origin頭。指定為False,表示任何情況下都不會(huì)返回Vary: Origin頭。
            // request.setResponseVary(Boolean.TRUE);
            ossClient.setBucketCORS(request);
        } 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();
            }
        }
    }
}
<?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;

// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
$bucket= "examplebucket";

$corsConfig = new CorsConfig();
$rule = new CorsRule();
// 設(shè)置允許跨域請(qǐng)求的響應(yīng)頭。AllowedHeader可以設(shè)置多個(gè),每個(gè)AllowedHeader中最多只能使用一個(gè)通配符星號(hào)(*)。
// 建議無(wú)特殊需求時(shí)設(shè)置AllowedHeader為星號(hào)(*)。
$rule->addAllowedHeader("*");
// 設(shè)置允許用戶從應(yīng)用程序中訪問(wèn)的響應(yīng)頭。ExposeHeader可以設(shè)置多個(gè),ExposeHeader中不支持使用通配符星號(hào)(*)。
$rule->addExposeHeader("x-oss-header");
// 設(shè)置允許的跨域請(qǐng)求的來(lái)源。AllowedOrigin可以設(shè)置多個(gè),每個(gè)AllowedOrigin中最多只能使用一個(gè)通配符星號(hào)(*)。
$rule->addAllowedOrigin("https://example.com:8080");
$rule->addAllowedOrigin("https://*.aliyun.com");
// 設(shè)置AllowedOrigin為星號(hào)(*)時(shí),表示允許所有域的來(lái)源。
//$rule->addAllowedOrigin("*");
// 設(shè)置允許的跨域請(qǐng)求方法。
$rule->addAllowedMethod("POST");
// 設(shè)置瀏覽器對(duì)特定資源的預(yù)取(OPTIONS)請(qǐng)求返回結(jié)果的緩存時(shí)間,單位為秒。
$rule->setMaxAgeSeconds(10);
// 每個(gè)Bucket最多支持添加10條規(guī)則。
$corsConfig->addRule($rule);
// 設(shè)置是否返回Vary: Origin頭,取值為false表示任意情況下均不返回Vary: Origin頭
$corsConfig->setResponseVary(false);

try{
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
    );
    $ossClient = new OssClient($config);

    // 已存在的規(guī)則將被覆蓋。
    $ossClient->putBucketCors($bucket, $corsConfig);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . ": OK" . "\n");            
const OSS = require('ali-oss');

const client = new OSS({
  // yourRegion填寫(xiě)B(tài)ucket所在地域。以華東1(杭州)為例,Region填寫(xiě)為oss-cn-hangzhou。
  region: 'yourRegion',
  // 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // 填寫(xiě)B(tài)ucket名稱(chēng)。
  bucket: 'yourBucket'
});

const rules = [{
        // 指定允許跨域請(qǐng)求的來(lái)源,支持通配符星號(hào)(*),表示允許所有的來(lái)源域。
        allowedOrigin: 'http://example.com',
        // 指定允許的跨域請(qǐng)求方法,支持GET、PUT、DELETE、POST和HEAD方法。
        allowedMethod: 'GET',
        // 指定允許跨域請(qǐng)求的響應(yīng)頭。建議無(wú)特殊情況下將此項(xiàng)設(shè)置為通配符星號(hào)(*)。
        allowedHeader: '*',
        // 指定允許用戶從應(yīng)用程序中訪問(wèn)的響應(yīng)頭,例如一個(gè)JavaScript的XMLHttpRequest對(duì)象。不允許使用通配符星號(hào)(*)。
        exposeHeader: 'Content-Length',
        // 指定瀏覽器對(duì)特定資源的預(yù)取(OPTIONS)請(qǐng)求返回結(jié)果的緩存時(shí)間,單位為秒。
        maxAgeSeconds: '30'
  },
];
// 最多允許設(shè)置10條跨域資源共享規(guī)則。如果配置了相同的規(guī)則,則已存在的規(guī)則將被覆蓋。
client.putBucketCORS("yourBucket", rules).then((r) => {
  console.log(r);
});           
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import BucketCors, CorsRule

# 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫(xiě)B(tài)ucket名稱(chēng),例如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)

# 已存在的規(guī)則將被覆蓋。
bucket.put_bucket_cors(BucketCors([rule]))            
using Aliyun.OSS;
using Aliyun.OSS.Common;

// yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
var bucketName = "examplebucket";

// 創(chuàng)建OSSClient實(shí)例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    var request = new SetBucketCorsRequest(bucketName);
    var rule1 = new CORSRule();
    // 指定允許跨域請(qǐng)求的來(lái)源。
    rule1.AddAllowedOrigin("http://example.com");
    // 指定允許的跨域請(qǐng)求方法(GET/PUT/DELETE/POST/HEAD)。
    rule1.AddAllowedMethod("POST");
    // AllowedHeaders和ExposeHeaders不支持通配符。
    rule1.AddAllowedHeader("*");
    // 指定允許用戶從應(yīng)用程序中訪問(wèn)的響應(yīng)頭。
    rule1.AddExposeHeader("x-oss-test");
    // 最多允許10條規(guī)則。
    request.AddCORSRule(rule1);
    var rule2 = new CORSRule();
    // AllowedOrigins和AllowedMethods最多支持一個(gè)星號(hào)(*)通配符。星號(hào)(*)表示允許所有的域來(lái)源或者操作。
    rule2.AddAllowedOrigin("http://example.net");
    rule2.AddAllowedMethod("GET");
    // 是否允許預(yù)取指令(OPTIONS)中Access-Control-Request-Headers頭中指定的Header。
    rule2.AddExposeHeader("x-oss-test2");
    // 指定瀏覽器對(duì)特定資源的預(yù)取(OPTIONS)請(qǐng)求返回結(jié)果的緩存時(shí)間,單位為秒。
    rule2.MaxAgeSeconds = 100;
    request.AddCORSRule(rule2);
    // 設(shè)置跨域資源共享規(guī)則。
    client.SetBucketCors(request);
    Console.WriteLine("Set bucket:{0} Cors succeeded ", bucketName);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error info: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}
package main

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"os"
)

func main() {
	// yourBucketName填寫(xiě)B(tài)ucket名稱(chēng)。
	bucketName := "yourBucketName"

	// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// 創(chuàng)建OSSClient實(shí)例。
	// yourEndpoint填寫(xiě)B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
	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
	// 設(shè)置跨域資源共享規(guī)則。
	err = client.SetBucketCORSV2(bucketName, put)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	fmt.Println("Set Success")
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS賬號(hào)信息。*/
            
    /* yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。*/
    std::string BucketName = "examplebucket";

    /* 初始化網(wǎng)絡(luò)等資源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);

    SetBucketCorsRequest request(BucketName);

    /* 設(shè)置跨域資源共享規(guī)則。*/
    auto rule1 = CORSRule();
    /* 指定允許跨域請(qǐng)求的來(lái)源。*/
    rule1.addAllowedOrigin("http://example.com");
    /* 指定允許跨域請(qǐng)求方法(GET/PUT/POST/DELETE/HEAD)。*/
    rule1.addAllowedMethod("POST");
    /* 是否允許預(yù)取指令(OPTIONS)中Access-Control-Request-Headers頭中指定的Header。*/
    rule1.addAllowedHeader("*");
    /* 指定允許用戶從應(yīng)用程序中訪問(wèn)的響應(yīng)頭。*/
    rule1.addExposeHeader("x-oss-test");
    /* 最多指定10條規(guī)則。*/
    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(request);

    if (!outcome.isSuccess()) {
        /* 異常處理。*/
        std::cout << "SetBucketCors fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* 釋放網(wǎng)絡(luò)等資源。*/
    ShutdownSdk();
    return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。*/
const char *bucket_name = "examplebucket";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* 用char*類(lèi)型的字符串初始化aos_string_t類(lèi)型。*/
    aos_str_set(&options->config->endpoint, endpoint);
    /* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量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表示不使用。*/
    options->config->is_cname = 0;
    /* 用于設(shè)置網(wǎng)絡(luò)相關(guān)參數(shù),比如超時(shí)時(shí)間等。*/
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* 在程序入口調(diào)用aos_http_io_initialize方法來(lái)初始化網(wǎng)絡(luò)、內(nèi)存等全局資源。*/
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* 用于內(nèi)存管理的內(nèi)存池(pool),等價(jià)于apr_pool_t。其實(shí)現(xiàn)代碼在apr庫(kù)中。*/
    aos_pool_t *pool;
    /* 重新創(chuàng)建一個(gè)內(nèi)存池,第二個(gè)參數(shù)是NULL,表示沒(méi)有繼承其它內(nèi)存池。*/
    aos_pool_create(&pool, NULL);
    /* 創(chuàng)建并初始化options,該參數(shù)包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
    oss_request_options_t *oss_client_options;
    /* 在內(nèi)存池中分配內(nèi)存給options。*/
    oss_client_options = oss_request_options_create(pool);
    /* 初始化Client的選項(xiàng)oss_client_options。*/
    init_options(oss_client_options);
    /* 初始化參數(shù)。*/
    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");
    /* 設(shè)置跨域資源共享規(guī)則。*/
    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");      
    }
    /* 釋放內(nèi)存池,相當(dāng)于釋放了請(qǐng)求過(guò)程中各資源分配的內(nèi)存。*/
    aos_pool_destroy(pool);
    /* 釋放之前分配的全局資源。*/
    aos_http_io_deinitialize();
    return 0;
}
require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  # Endpoint以華東1(杭州)為例,其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
  endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
  # 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  access_key_id: ENV['OSS_ACCESS_KEY_ID'],
  access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)

# 填寫(xiě)B(tài)ucket名稱(chēng),例如examplebucket。
bucket = client.get_bucket('examplebucket')
# 設(shè)置跨域資源共享規(guī)則。
bucket.cors = [
    Aliyun::OSS::CORSRule.new(
      # 指定允許跨域請(qǐng)求的來(lái)源,例如http://example.com。
      :allowed_origins => ['http://example.com', 'http://example.net'],
      # 指定允許的跨域請(qǐng)求的HTTP方法(GET/PUT/DELETE/POST/HEAD)。
      :allowed_methods => ['PUT', 'POST', 'GET'],
      # 在OPTIONS預(yù)取指令中允許的header,例如x-oss-test。
      :allowed_headers => ['x-oss-test'],
      # 指定允許用戶從應(yīng)用程序中訪問(wèn)的響應(yīng)頭。
      :expose_headers => ['x-oss-test1'],
      # 指定瀏覽器對(duì)特定資源的預(yù)取(OPTIONS)請(qǐng)求返回結(jié)果的緩存時(shí)間,單位為秒。
      :max_age_seconds => 100)
]

使用命令行工具ossutil

關(guān)于使用ossutil跨域設(shè)置的具體操作, 請(qǐng)參見(jiàn)添加或修改CORS配置

使用REST API

如果您的程序自定義要求較高,您可以直接發(fā)起REST API請(qǐng)求。直接發(fā)起REST API請(qǐng)求需要手動(dòng)編寫(xiě)代碼計(jì)算簽名。更多信息,請(qǐng)參見(jiàn)PutBucketCors

常見(jiàn)問(wèn)題

CORS配置項(xiàng)常見(jiàn)錯(cuò)誤

關(guān)于CORS配置項(xiàng)常見(jiàn)錯(cuò)誤及排查方法,請(qǐng)參見(jiàn)OSS跨域資源共享(CORS)錯(cuò)誤排除

報(bào)“No 'Access-Control-Allow-Origin'”錯(cuò)誤

關(guān)于出現(xiàn)該錯(cuò)誤的原因及解決方案,請(qǐng)參見(jiàn)設(shè)置跨域規(guī)則后調(diào)用OSS時(shí)仍然報(bào)“No 'Access-Control-Allow-Origin'”的錯(cuò)誤

使用CDN域名訪問(wèn)OSS遇到跨域問(wèn)題

如果您使用CDN域名訪問(wèn)OSS遇到跨域問(wèn)題,需在CDN控制臺(tái)配置跨域規(guī)則。具體操作,請(qǐng)參見(jiàn)CDN如何配置跨域資源共享(CORS)

發(fā)送跨域請(qǐng)求時(shí)報(bào)錯(cuò)Access-Control-Allow-Origin不能為*

報(bào)錯(cuò)Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.時(shí),您可以將OSS中Access-Control-Allow-Origin的值修改為具體的域名,或在前端代碼中設(shè)置xhr.withCredentials = false;來(lái)解決此問(wèn)題。詳情請(qǐng)參見(jiàn)發(fā)送跨域請(qǐng)求時(shí)報(bào)錯(cuò)Access-Control-Allow-Origin不能為*

為什么配置了兩條跨域規(guī)則,沒(méi)有都生效?

如果您配置了兩條跨域規(guī)則,OSS會(huì)依次檢查每一條規(guī)則,使用第一條匹配的規(guī)則來(lái)允許請(qǐng)求并返回對(duì)應(yīng)的Header。

上一篇: 防盜鏈常見(jiàn)問(wèn)題 下一篇: 設(shè)置跨域規(guī)則后調(diào)用OSS時(shí)仍然報(bào)“No 'Access-Control-Allow-Origin'”的錯(cuò)誤
阿里云首頁(yè) 對(duì)象存儲(chǔ) 相關(guān)技術(shù)圈