全部產品
Search
文件中心

Object Storage Service:Go靜態網站託管(鏡像回源)

更新時間:Oct 29, 2024

您可以將儲存空間(Bucket)設定為靜態網站託管模式並設定鏡像回源的跳轉規則(RoutingRule)。靜態網站託管模式配置生效後,訪問網站相當於訪問Bucket,並且能夠自動跳轉至指定的索引頁面和錯誤頁面。鏡像回源的跳轉規則配置生效後,可用於資料無縫遷移到OSS的情境。

注意事項

  • 本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS訪問網域名稱、資料中心、開放連接埠

  • 本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證

  • 本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化

  • 要設定靜態網站託管或者鏡像回源,您必須有oss:PutBucketWebsite許可權;要擷取靜態網站託管或者鏡像回源,您必須有oss:GetBucketWebsite許可權;要刪除靜態網站託管或者鏡像回源,您必須有oss:DeleteBucketWebsite許可權。具體操作,請參見為RAM使用者授權自訂的權限原則

靜態網站託管

靜態網站是指所有的網頁都由靜態內容構成,包括用戶端執行的指令碼(例如JavaScript)。您可以通過靜態網站託管功能將您的靜態網站託管到Bucket,並使用Bucket的訪問網域名稱訪問這個網站。

  • 設定靜態網站託管

    以下代碼用於設定靜態網站託管:

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 建立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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    
    	// 設定靜態網站託管的預設首頁為index.html, 預設404頁為error.html。
    	err = client.SetBucketWebsite(bucketName, "index.html", "error.html")
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    }
    
  • 查看靜態網站託管配置

    以下代碼用於查看靜態網站託管配置:

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 建立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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    
    	// 查看靜態網站託管配置。
    	wsRes, err := client.GetBucketWebsite(bucketName)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Println("indexWebsite: ", wsRes.IndexDocument.Suffix)
    	fmt.Println("errorWebsite: ", wsRes.ErrorDocument.Key)
    }
    
  • 刪除靜態網站託管配置

    以下代碼用於刪除靜態網站託管配置:

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 建立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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    
    	// 刪除靜態網站託管配置。
    	err = client.DeleteBucketWebsite(bucketName)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    }
    

鏡像回源

鏡像回源主要用於資料無縫遷移到OSS的情境。例如某服務已經在使用者建立的來源站點或者在其他雲產品上運行,現因業務發展,需要將服務遷移至OSS,遷移時需保證服務的正常運行。您可以在遷移過程中使用鏡像回源規則擷取未遷移至OSS的部分資料,保證服務的正常運行。

  • 設定鏡像回源

    例如,當要求者訪問目標Bucket中不存在的檔案時,可以通過指定回源條件和回源地址,從來源站點中擷取目標檔案。例如您在華東1(杭州)有名為examplebucket的Bucket,您希望要求者訪問Bucket根目錄下examplefolder目錄中不存在的檔案時,可以從www.example.com網站的examplefolder目錄擷取目標檔案。

    以下代碼用於設定符合上述情境的鏡像回源規則:

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 建立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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    
    	var indexWebsite = "myindex.html"
    	var errorWebsite = "myerror.html"
    
    	btrue := true
    	bfalse := false
    	// 指定回源類型為鏡像。
    	ruleOk := oss.RoutingRule{
    		RuleNumber: 1,
    		Condition: oss.Condition{
    			KeyPrefixEquals: "",
    			// 指定回源條件為HTTP狀態代碼404。
    			HTTPErrorCodeReturnedEquals: 404,
    		},
    		Redirect: oss.Redirect{
    			RedirectType: "Mirror",
    			// PassQueryString: &btrue,
    			// 指定回源地址。
    			MirrorURL: "http://www.test.com/",
    			// MirrorPassQueryString:&btrue,
    			// MirrorFollowRedirect:&bfalse,
    			// MirrorCheckMd5:&bfalse,
    			MirrorHeaders: oss.MirrorHeaders{
    				// PassAll:&bfalse,
    				// 允許傳遞指定HTTP Header參數。
    				Pass: []string{"myheader-key1", "myheader-key2"},
    				// 禁止傳遞指定HTTP Header參數。
    				Remove: []string{"myheader-key3", "myheader-key4"},
    				Set: []oss.MirrorHeaderSet{
    					{
    						Key:   "myheader-key5",
    						Value: "myheader-value5",
    					},
    				},
    			},
    		},
    	}
    
    	// 指定回源類型為重新導向。
    	ruleArrOk := []oss.RoutingRule{
    		{
    			RuleNumber: 2,
    			Condition: oss.Condition{
    				// 指定回源條件為HTTP狀態代碼404,檔案名稱首碼為abc/。
    				KeyPrefixEquals:             "abc/",
    				HTTPErrorCodeReturnedEquals: 404,
    				IncludeHeader: []oss.IncludeHeader{
    					{
    						Key:    "host",
    						Equals: "test.oss-cn-beijing-internal.aliyuncs.com",
    					},
    				},
    			},
    			Redirect: oss.Redirect{
    				RedirectType:     "AliCDN",
    				Protocol:         "http",
    				HostName:         "www.test.com",
    				PassQueryString:  &bfalse,
    				ReplaceKeyWith:   "prefix/${key}.suffix",
    				HttpRedirectCode: 301,
    			},
    		},
    		// 指定回源類型為鏡像。
    		{
    			RuleNumber: 3,
    			Condition: oss.Condition{
    				KeyPrefixEquals:             "",
    				HTTPErrorCodeReturnedEquals: 404,
    			},
    			Redirect: oss.Redirect{
    				RedirectType:          "Mirror",
    				PassQueryString:       &btrue,
    				MirrorURL:             "http://www.test.com/",
    				MirrorPassQueryString: &btrue,
    				MirrorFollowRedirect:  &bfalse,
    				MirrorCheckMd5:        &bfalse,
    				MirrorHeaders: oss.MirrorHeaders{
    					PassAll: &btrue,
    					Pass:    []string{"myheader-key1", "myheader-key2"},
    					Remove:  []string{"myheader-key3", "myheader-key4"},
    					Set: []oss.MirrorHeaderSet{
    						{
    							Key:   "myheader-key5",
    							Value: "myheader-value5",
    						},
    					},
    				},
    			},
    		},
    	}
    
    	wxmlOne := oss.WebsiteXML{
    		IndexDocument: oss.IndexDocument{
    			Suffix: indexWebsite,
    		},
    		ErrorDocument: oss.ErrorDocument{
    			Key: errorWebsite,
    		},
    	}
    	wxmlOne.RoutingRules = append(wxmlOne.RoutingRules, ruleOk)
    	wxmlOne.RoutingRules = append(wxmlOne.RoutingRules, ruleArrOk...)
    	err = client.SetBucketWebsiteDetail(bucketName, wxmlOne)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    }
    
  • 擷取鏡像回源配置

    以下代碼用於擷取鏡像回源配置:

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 建立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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    	// 擷取鏡像回源配置。
    	data, err := client.GetBucketWebsiteXml(bucketName)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	fmt.Println(data)
    }
    
  • 刪除鏡像回源配置

    以下代碼用於刪除鏡像回源配置:

    package main
    
    import (
    	"fmt"
    	"os"
    
    	"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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 建立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 {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    
    	// 填寫Bucket名稱,例如examplebucket。
    	bucketName := "examplebucket"
    
    	// 刪除鏡像回源配置。
    	err = client.DeleteBucketWebsite(bucketName)
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    }
    

相關文檔

  • 關於靜態網站託管以及鏡像回源的完整範例程式碼,請參見GitHub樣本

  • 關於設定靜態網站託管或者鏡像回源的API介面說明,請參見PutBucketWebsite

  • 關於擷取靜態網站託管或者鏡像回源的API介面說明,請參見GetBucketWebsite

  • 關於刪除靜態網站託管或者鏡像回源的API介面說明,請參見DeleteBucketWebsite