因瀏覽器的同源策略限制,在不同網域名稱之間進行資料互動或者資源共用時,會出現跨域請求被拒絕的問題。您可以通過設定允許特定的網域名稱、方法和要求標頭的跨域存取原則,解決跨域問題。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS訪問網域名稱、資料中心、開放連接埠。
本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化。
要設定跨域規則,您必須有
oss:PutBucketCors
許可權;要擷取跨域規則,您必須有oss:GetBucketCors
許可權;要刪除跨域規則,您必須有oss:DeleteBucketCors
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
範例程式碼
設定跨域資源共用規則
以下代碼用於設定指定儲存空間的跨域規則:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// yourBucketName填寫Bucket名稱。
bucketName := "yourBucketName"
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error creating credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error creating OSS client: %v", err)
}
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
// 設定跨域資源共用規則。
err = client.SetBucketCORSV2(bucketName, put)
if err != nil {
log.Fatalf("Error setting CORS rules: %v", err)
}
log.Println("Set Success")
}
擷取跨域資源共用規則
以下代碼用於擷取跨域規則:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// yourBucketName填寫Bucket名稱。
bucketName := "yourBucketName"
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error creating credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error creating OSS client: %v", err)
}
// 擷取跨域資源共用規則。
corsRes, err := client.GetBucketCORS(bucketName)
if err != nil {
log.Fatalf("Error getting CORS rules: %v", err)
}
// 列印跨域資源共用規則。
for _, rule := range corsRes.CORSRules {
log.Printf("Cors Rules Allowed Origin: %v", rule.AllowedOrigin)
log.Printf("Cors Rules Allowed Method: %v", rule.AllowedMethod)
log.Printf("Cors Rules Allowed Header: %v", rule.AllowedHeader)
log.Printf("Cors Rules Expose Header: %v", rule.ExposeHeader)
log.Printf("Cors Rules Max Age Seconds: %d", rule.MaxAgeSeconds)
}
if corsRes.ResponseVary != nil {
log.Printf("Cors Rules Response Vary: %t", *corsRes.ResponseVary)
}
}
刪除跨域資源共用規則
以下代碼用於刪除指定儲存空間的所有跨域規則:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error creating credentials provider: %v", err)
}
// 建立OSSClient執行個體。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地區,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設定簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error creating OSS client: %v", err)
}
// 填寫Bucket名稱,例如examplebucket。
bucketName := "examplebucket"
// 刪除跨域資源共用規則。
err = client.DeleteBucketCORS(bucketName)
if err != nil {
log.Fatalf("Error deleting CORS rules: %v", err)
}
log.Println("Delete Bucket CORS Success")
}
相關文檔
關於跨域資源共用的完整範例程式碼,請參見GitHub樣本。
關於設定跨域規則的API介面說明,請參見SetBucketCORSV2。
關於擷取跨域規則的API介面說明,請參見GetBucketCORS。
關於刪除跨域規則的API介面說明,請參見DeleteBucketCORS。