Go静态网站托管(镜像回源)

您可以将存储空间(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