您可以将存储空间(Bucket)设置为静态网站托管模式并设置镜像回源的跳转规则(RoutingRule)。静态网站托管模式配置生效后,访问网站相当于访问Bucket,并且能够自动跳转至指定的索引页面和错误页面。镜像回源的跳转规则配置生效后,可用于数据无缝迁移到OSS的场景。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心
  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见Go初始化
  • 要设置静态网站托管或者镜像回源,您必须有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() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        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() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        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() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        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() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
    
        // 填写Bucket名称,例如examplebucket。
        bucketName := "examplebucket"
        putXml := `<WebsiteConfiguration>
          <IndexDocument>
            <Suffix>index.html</Suffix>
            <SupportSubDir>true</SupportSubDir>
            <Type>0</Type>
          </IndexDocument>
          <ErrorDocument>
            <Key>error.html</Key>
            <HttpStatus>404</HttpStatus>
          </ErrorDocument>
          <RoutingRules>
            <RoutingRule>
              <RuleNumber>1</RuleNumber>
              <Condition>
                <! --只有匹配此前缀的Object才能匹配此规则。-->
                <KeyPrefixEquals>examplefolder/</KeyPrefixEquals>
                <! --访问指定Object时,返回status 404才能匹配此规则。-->
                <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
              </Condition>
              <Redirect>
                <! --指定跳转的类型。-->
                <RedirectType>Mirror</RedirectType>
                <PassQueryString>true</PassQueryString>
                <! --指定镜像回源的源站地址。本示例中指定为https://www.example.com/。-->
                <MirrorURL>http://example.com/</MirrorURL>-->           
                <! --指定执行跳转或者镜像回源规则时,是否携带请求参数。-->
                <PassQueryString>true</PassQueryString>
                <! --与PassQueryString作用相同,优先级高于PassQueryString。只有设置RedirectType为Mirror时生效。-->
                <MirrorPassQueryString>true</MirrorPassQueryString>
                <! --指定跳转时返回的状态码。只有设置RedirectType为External或者AliCDN时生效。-->
                <HttpRedirectCode>302</HttpRedirectCode>
                <! --指定跳转时的域名,域名需符合域名规范。-->
                <HostName>oss.aliyuncs.com</HostName>
                <! --指定跳转时的协议。只有设置RedirectType为External或者AliCDN时才生效。-->
                <Protocol>https</Protocol>
                <! --Redirect时Object名称将替换成ReplaceKeyWith指定的值,ReplaceKeyWith支持设置变量。-->
                <ReplaceKeyWith>key.jpg</ReplaceKeyWith>
                <! --如果设置此字段为true,则Object的前缀将被替换为ReplaceKeyPrefixWith指定的值。-->
                <EnableReplacePrefix>true</EnableReplacePrefix>
                <! --Redirect时Object名称的前缀将替换成该值。-->
                <ReplaceKeyPrefixWith>examplebucket</ReplaceKeyPrefixWith>
                <! --是否检查回源body的MD5。只有设置RedirectType为Mirror时生效。-->
                <MirrorCheckMd5>false</MirrorCheckMd5>
                <! --如果镜像回源获取的结果为3xx,是否继续跳转到指定的Location获取数据。 只有设置RedirectType为Mirror时才生效。-->
                <MirrorFollowRedirect>true</MirrorFollowRedirect>
                <MirrorHeaders>
                  <! --是否透传除以下Header之外的其他Header到源站。只有设置RedirectType为Mirror时生效。-->
                  <PassAll>true</PassAll>
                  <! --透传指定的Header到源站。只有设置RedirectType为Mirror时生效。-->
                  <Pass>myheader-key1</Pass>
                  <Pass>myheader-key2</Pass>
                  <! --禁止透传指定的Header到源站。只有设置RedirectType为Mirror时生效。-->
                  <Remove>myheader-key3</Remove>
                  <Remove>myheader-key4</Remove>
                   <! --设置一个Header传到源站,不管请求中是否携带这些指定的Header,回源时都会设置这些Header。-->
                  <Set>
                    <Key>myheader-key5</Key>
                    <Value>myheader-value5</Value>
                  </Set>
                </MirrorHeaders>
              </Redirect>
            </RoutingRule>
          </RoutingRules>
        </WebsiteConfiguration>    `
    
        err = client.SetBucketWebsiteXml(bucketName,putXml)
        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() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        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() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        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