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

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

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的RegionEndpoint的对应关系,请参见OSS地域和访问域名

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化

  • 要设置静态网站托管或者镜像回源,您必须有oss:PutBucketWebsite权限;要获取静态网站托管或者镜像回源,您必须有oss:GetBucketWebsite权限;要删除静态网站托管或者镜像回源,您必须有oss:DeleteBucketWebsite权限。具体操作,请参见RAM用户授权自定义的权限策略

静态网站托管

  • 设置静态网站托管

    以下代码用于设置静态网站托管:

    #-*-coding:utf-8-*-
    import oss2
    from oss2.models import BucketWebsite
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
    region = "cn-hangzhou"
    
    # examplebucket填写存储空间名称。
    bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
    
    # 开启静态网站托管模式,并将默认首页设置为index.html,默认404页设置为error.html。
    bucket.put_bucket_website(BucketWebsite('index.html', 'error.html'))           
  • 查看静态网站托管配置

    以下代码用于查看静态网站托管配置:

    #-*-coding:utf-8-*-
    import oss2
    from oss2.models import BucketWebsite
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
    region = "cn-hangzhou"
    
    # examplebucket填写存储空间名称。
    bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
    
    try:
        # 如果指定的Bucket未开启静态网站托管模式,则调用get_bucket_website时会抛出NoSuchWebsite异常。
        website = bucket.get_bucket_website()
        print('Index file is {0}, error file is {1}'.format(website.index_file, website.error_file))
    except oss2.exceptions.NoSuchWebsite as e:
        print('Website is not configured, request_id={0}'.format(e.request_id))           
  • 删除静态网站托管配置

    以下代码用于删除静态网站托管配置:

    #-*-coding:utf-8-*-
    import oss2
    from oss2.models import BucketWebsite
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
    region = "cn-hangzhou"
    
    # examplebucket填写存储空间名称。
    bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
    
    # 删除静态网站托管配置。
    bucket.delete_bucket_website()           

镜像回源

镜像回源主要用于数据无缝迁移到OSS的场景。例如某服务已经在用户建立的源站或者在其他云产品上运行,现因业务发展,需要将服务迁移至OSS,迁移时需保证服务的正常运行。您可以在迁移过程中使用镜像回源规则获取未迁移至OSS的部分数据,保证服务的正常运行。

  • 设置镜像回源

    例如,当请求者访问目标Bucket中不存在的文件时,可以通过指定回源条件和回源地址,从源站中获取目标文件。例如您在华东1(杭州)有名为examplebucketBucket,您希望请求者访问Bucket根目录下examplefolder目录中不存在的文件时,可以从https://www.example.com/站点的examplefolder目录获取目标文件。

    以下代码用于设置符合上述场景的镜像回源规则:

    #-*-coding:utf-8-*-
    import oss2
    from oss2.models import BucketWebsite, MirrorHeadersSet, RedirectMirrorHeaders, Redirect, RoutingRule, \
        REDIRECT_TYPE_MIRROR, Condition
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
    region = "cn-hangzhou"
    
    # examplebucket填写存储空间名称。
    bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
    
    # 开启静态网站托管模式,并将默认首页设置为index.html,默认404页设置为error.html。
    index_file = 'index.html'
    error_file = 'error.html'
    # 设置匹配的条件。
    condition1 = Condition(key_prefix_equals='examplefolder',
                           http_err_code_return_equals=404)
    
    # 指定镜像回源时携带的Header。
    mirror_headers_set_1 = MirrorHeadersSet("myheader-key5", "myheader-value5")
    mirror_headers_set_2 = MirrorHeadersSet("myheader-key6", "myheader-value6")
    set_list = [mirror_headers_set_1, mirror_headers_set_2]
    pass_list = ['myheader-key1', 'myheader-key2']
    remove_list = ['myheader-key3', 'myheader-key4']
    mirror_header = RedirectMirrorHeaders(pass_all=True, pass_list=pass_list, remove_list=remove_list, set_list=set_list)
    # 指定匹配此规则后执行的动作。
    redirect1 = Redirect(redirect_type=REDIRECT_TYPE_MIRROR, mirror_url='https://www.example.com/',
                         mirror_pass_query_string=True, mirror_follow_redirect=True, mirror_check_md5=True,
                         mirror_headers=mirror_header)
    
    rule1 = RoutingRule(rule_num=1, condition=condition1, redirect=redirect1)
    website_set = BucketWebsite(index_file, error_file, [rule1])
    
    # 设置镜像回源。
    bucket.put_bucket_website(website_set)
  • 获取镜像回源配置

    以下代码用于获取镜像回源配置:

    #-*-coding:utf-8-*-
    import oss2
    from oss2.models import BucketWebsite, MirrorHeadersSet, RedirectMirrorHeaders, Redirect, RoutingRule, \
        REDIRECT_TYPE_MIRROR, Condition
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
    region = "cn-hangzhou"
    
    # examplebucket填写存储空间名称。
    bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
    
    try:
        # 如果指定的Bucket未开启静态网站托管模式,则调用get_bucket_website时会抛出NoSuchWebsite异常。
        website_get = bucket.get_bucket_website()
        # 获取默认首页。
        print(website_get.index_file)
        # 获取默认404页。
        print(website_get.error_file)
        for rule in website_get.rules:
            print(rule.rule_num)
            # 获取规则匹配的前缀。
            print(rule.condition.key_prefix_equals)
            # 获取HTTP状态码。
            print(rule.condition.http_err_code_return_equals)
            # 获取跳转的类型。
            print(rule.redirect.redirect_type)
            # 获取镜像回源的源站地址。
            print(rule.redirect.mirror_url)
            # 获取携带的请求参数。
            print(rule.redirect.pass_query_string)
            # 获取RedirectObject名称通过ReplaceKeyWith指定的替换值,ReplaceKeyWith支持变量。
            # print(rule.redirect.replace_key_with)
            # 获取RedirectObject名称的前缀替换值。如果前缀为空,则将这个字符串插入Object名称的前面。
            # print(rule.redirect.replace_key_prefix_with)
            # 获取跳转时的协议。
            # print(rule.redirect.proto)
            # 获取跳转时的域名。
            # print(rule.redirect.host_name)
            # 获取跳转时返回的状态码。
            # print(rule.redirect.http_redirect_code)
    except oss2.exceptions.NoSuchWebsite as e:
        print('Website is not configured, request_id={0}'.format(e.request_id))
  • 删除镜像回源配置

    以下代码用于删除镜像回源配置:

    #-*-coding:utf-8-*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # 填写Endpoint对应的Region信息,例如cn-hangzhou。注意,v4签名下,必须填写该参数
    region = "cn-hangzhou"
    
    # examplebucket填写存储空间名称。
    bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
    
    # 删除镜像回源配置。
    bucket.delete_bucket_website()           

相关文档

  • 关于设置静态网站或者镜像回源的API接口说明,请参见PutBucketWebsite

  • 关于获取静态网站或者镜像回源的API接口说明,请参见GetBucketWebsite

  • 关于删除静态网站或者镜像回源的API接口说明,请参见DeleteBucketWebsite