
# 设置镜像回源规则(C SDK)
![](https://support.huaweicloud.com/sdk-c-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
开发过程中，您有任何问题可以在GitHub上[提交issue](https://github.com/huaweicloud/huaweicloud-sdk-c-obs/issues)，或者在[华为云对象存储服务论坛](https://bbs.huaweicloud.com/forum/forum-620-1.html)中发帖求助。
#### 功能说明
镜像回源是OBS提供的一种数据自动获取功能。调用设置桶镜像回源规则接口，您可为指定桶配置镜像回源规则，当客户端访问桶中不存在的对象时，OBS会自动从源站获取数据并返回给客户端，同时将数据存储到桶中。
#### 接口约束
- 您必须是桶拥有者或拥有设置桶镜像回源规则的权限，才能设置桶镜像回源规则。建议使用IAM或桶策略进行授权，如果使用IAM则需授予obs:bucket:PutBucketMirrorBackToSource权限，如果使用桶策略则需授予PutBucketMirrorBackToSource权限。相关授权方式介绍可参见[OBS权限控制概述](https://support.huaweicloud.com/perms-cfg-obs/obs_40_0001.html)，配置方式详见[使用IAM自定义策略](https://support.huaweicloud.com/usermanual-obs/obs_03_0121.html)、[自定义创建桶策略](https://support.huaweicloud.com/usermanual-obs/obs_03_0123.html)。
- OBS支持的Region与Endpoint的对应关系，详细信息请参见[地区与终端节点](https://console.huaweicloud.com/apiexplorer/#/endpoint/OBS)。
- 每个桶最多配置10条镜像回源规则。
- 规则ID在桶内必须唯一。
 
#### 方法定义
```
void set_bucket_mirror_back_to_source(const obs_options *options,
    obs_mirror_back_to_source_rule *mirror_back_to_source_rules,
    unsigned int rule_number,
    obs_response_handler *handler, void *callback_data);
```
#### 请求参数说明
表1请求参数列表 
| 参数名称                        | 参数类型                                                                                                                  | 是否必选 | 描述                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|:---|
| options                     | const [obs_options](https://support.huaweicloud.com/sdk-c-devg-obs/obs_20_0085.html#obs_20_0085__table9681927859)\*   | 必选   | **参数解释：** 请求桶的上下文，通过obs_options设置AK、SK、endpoint、bucket、超时时间、临时鉴权。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                        |
| mirror_back_to_source_rules | [表1 obs_mirror_back_to_source_rule]\*                                                | 必选   | **参数解释：** 镜像回源规则数组。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                                                                                                                                      |
| rule_number                 | unsigned int                                                                                                          | 必选   | **参数解释：** 镜像回源规则的数量。 **约束限制：** 无 **取值范围：** \[1, 10\] **默认取值：** 无                                                                                                                                |
| handler                     | [obs_response_handler](https://support.huaweicloud.com/sdk-c-devg-obs/obs_20_0087.html#obs_20_0087__table53755070) \* | 必选   | **参数解释：** 回调结构体，结构体内所有成员都是回调函数的指针，用于设置处理接口响应数据的回调函数。您可以通过设置回调函数，把服务端的响应数据复制到您的自定义回调数据callback_data中。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无 |
| callback_data               | void \*                                                                                                               | 可选   | **参数解释：** 用户自定义回调数据。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                                                                                                                                   |
   
 表2obs_mirror_back_to_source_rule 
| 参数名称      | 参数类型                                                                     | 是否必选 | 描述                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| id        | char \*                                                                  | 必选   | **参数解释：** 规则ID，在桶内唯一标识一条镜像回源规则。 **约束限制：** 无 **取值范围：** 长度为1\~256的字符串。 **默认取值：** 无 |
| condition | [表1 obs_mirror_back_to_source_condition] | 必选   | **参数解释：** 镜像回源条件，指定触发回源请求的条件。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无            |
| redirect  | [表4]                                     | 必选   | **参数解释：** 重定向配置，指定回源时的目标源站及重定向行为。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无       |
   
 表3obs_mirror_back_to_source_condition 
| 参数名称                            | 参数类型    | 是否必选 | 描述                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|:---|:---|:---|
| http_error_code_returned_equals | char \* | 必选   | **参数解释：** OBS返回的HTTP错误码，当OBS返回该错误码时触发镜像回源。 **约束限制：** 无 **取值范围：** HTTP状态码，如404、403。 **默认取值：** 无 |
| key_prefix_equals               | char \* | 可选   | **参数解释：** 对象名前缀，仅当访问的对象名匹配该前缀时才触发回源。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                          |
   
 表4obs_mirror_back_to_source_redirect 
| 参数名称                            | 参数类型                                                                          | 是否必选 | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|:---|
| agency                          | char \*                                                                       | 必选   | **参数解释：** IAM委托名称，用于授权OBS服务访问源站。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                                                                                                                                                        |
| public_source                   | [表1 obs_mirror_back_to_source_public_source] | 必选   | **参数解释：** 源站配置，指定镜像回源的目标源站地址。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                                                                                                                                                    |
| retry_conditions                | char \*\*                                                                     | 可选   | **参数解释：** 重试条件列表，当回源请求满足指定条件时进行重试。 **约束限制：** 最多20个重试条件。 **取值范围：** 无 **默认取值：** 无                                                                                                                                        |
| retry_conditions_number         | unsigned int                                                                  | 可选   | **参数解释：** 重试条件的数量。 **约束限制：** 无 **取值范围：** \[0, 20\] **默认取值：** 0                                                                                                                                                          |
| pass_query_string               | int                                                                           | 可选   | **参数解释：** 是否透传查询字符串到源站。 **约束限制：** 无 **取值范围：** - 0：不透传  - 1：透传   **默认取值：** 0                 |
| mirror_follow_redirect          | int                                                                           | 可选   | **参数解释：** 是否跟随源站的重定向响应。 **约束限制：** 无 **取值范围：** - 0：不跟随  - 1：跟随   **默认取值：** 0                |
| mirror_http_header              | [表2 obs_mirror_back_to_source_http_header]  | 可选   | **参数解释：** HTTP头部配置，用于控制回源请求中HTTP头部的透传、移除和设置行为。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                                                                                                                                      |
| replace_key_with                | char \*                                                                       | 可选   | **参数解释：** 回源时将对象名替换为指定值。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                                                                                                                                                            |
| replace_key_prefix_with         | char \*                                                                       | 可选   | **参数解释：** 回源时将对象名前缀替换为指定值。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                                                                                                                                                         |
| vpc_endpoint_urn                | char \*                                                                       | 可选   | **参数解释：** VPC终端节点URN，用于通过VPC终端节点访问源站。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无                                                                                                                                            |
| redirect_without_referer        | int                                                                           | 可选   | **参数解释：** 是否不带Referer头回源。 **约束限制：** 无 **取值范围：** - 0：带Referer  - 1：不带Referer   **默认取值：** 0 |
| mirror_allow_http_method        | char \*\*                                                                     | 可选   | **参数解释：** 允许的HTTP方法列表。 **约束限制：** 最多2个HTTP方法。 **取值范围：** 无 **默认取值：** 无                                                                                                                                                   |
| mirror_allow_http_method_number | unsigned int                                                                  | 可选   | **参数解释：** 允许的HTTP方法数量。 **约束限制：** 无 **取值范围：** \[0, 2\] **默认取值：** 0                                                                                                                                                          |
   
 表5obs_mirror_back_to_source_public_source 
| 参数名称            | 参数类型                                                                          | 是否必选 | 描述                                                                                                                                                                                                                                                                                |
|:---|:---|:---|:---|
| source_endpoint | [表1 obs_mirror_back_to_source_source_endpoint] | 必选   | **参数解释：** 源站终端节点配置，指定主备源站地址。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无 |
   
 表6obs_mirror_back_to_source_source_endpoint 
| 参数名称          | 参数类型         | 是否必选 | 描述                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|:---|:---|
| master        | char \*\*    | 必选   | **参数解释：** 主源站地址列表。 **约束限制：** 最多5个主源站地址。                                                                                                                                                                                             |
| master_number | unsigned int | 必选   | **参数解释：** 主源站地址的数量。 **约束限制：** 无 **取值范围：** \[1, 5\] **默认取值：** 无 |
| slave         | char \*\*    | 可选   | **参数解释：** 备源站地址列表，当主源站不可用时使用。 **约束限制：** 最多5个备源站地址。                                                                                                                                                                                |
| slave_number  | unsigned int | 可选   | **参数解释：** 备源站地址的数量。 **约束限制：** 无 **取值范围：** \[0, 5\] **默认取值：** 0    |
   
 表7obs_mirror_back_to_source_http_header 
| 参数名称          | 参数类型                                    | 是否必选 | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| pass_all      | int                                     | 可选   | **参数解释：** 是否透传所有HTTP头部到源站。 **约束限制：** 无 **取值范围：** - 0：不透传所有头部  - 1：透传所有头部。   **默认取值：** 0 |
| pass          | char \*\*                               | 可选   | **参数解释：** 需要透传的HTTP头部名称列表。 **约束限制：** 最多10个头部名称。 **取值范围：** 无 **默认取值：** 无                                                                                                                                                      |
| pass_number   | unsigned int                            | 可选   | **参数解释：** 需要透传的HTTP头部数量。 **约束限制：** 无 **取值范围：** \[0, 10\] **默认取值：** 0                                                                                                                                                       |
| remove        | char \*\*                               | 可选   | **参数解释：** 需要移除的HTTP头部名称列表。 **约束限制：** 最多10个头部名称。 **取值范围：** 无 **默认取值：** 无                                                                                                                                             |
| remove_number | unsigned int                            | 可选   | **参数解释：** 需要移除的HTTP头部数量。 **约束限制：** 无 **取值范围：** \[0, 10\] **默认取值：** 0                                                                                                                                                          |
| set           | [表8]\* | 可选   | **参数解释：** 需要设置的HTTP头部列表。 **约束限制：** 最多10个头部。 **取值范围：** 无 **默认取值：** 无                                                                                                                                                     |
| set_number    | unsigned int                            | 可选   | **参数解释：** 需要设置的HTTP头部数量。 **约束限制：** 无 **取值范围：** \[0, 10\] **默认取值：** 0                                                                                                                                                          |
   
 表8obs_mirror_back_to_source_set_http_header 
| 参数名称  | 参数类型    | 是否必选 | 描述                                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|
| key   | char \* | 必选   | **参数解释：** HTTP头部的名称。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无 |
| value | char \* | 必选   | **参数解释：** HTTP头部的值。 **约束限制：** 无 **取值范围：** 无 **默认取值：** 无  |
   
#### 代码示例
以下示例展示如何设置简单的镜像回源规则（404回源）。
```
#include "eSDKOBS.h"
#include <stdio.h>
obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data);
void response_complete_callback(obs_status status, const obs_error_details *error, void *callback_data);
int main()
{
    obs_initialize(OBS_INIT_ALL);
    obs_options options;
    init_obs_options(&options);
   // host_name填写桶所在的endpoint, 此处以华北-北京四为例，其他地区请按实际情况填写。
    options.bucket_options.host_name = "obs.cn-north-4.myhuaweicloud.com";
    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；
    // 本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。
    options.bucket_options.access_key = getenv("ACCESS_KEY_ID");
    options.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
    options.bucket_options.bucket_name = "example-bucket-name";
    // 配置主源站地址
    char *master_endpoints[] = {"https://source.example.com"};
    obs_mirror_back_to_source_source_endpoint source_endpoint = {0};
    source_endpoint.master = master_endpoints;
    source_endpoint.master_number = 1;
    // 配置源站信息
    obs_mirror_back_to_source_public_source public_source = {0};
    public_source.source_endpoint = source_endpoint;
    // 配置镜像回源重定向规则
    obs_mirror_back_to_source_redirect redirect = {0};
    redirect.agency = "your-agency-name";
    redirect.public_source = public_source;
    redirect.pass_query_string = 1;
    // 配置镜像回源条件
    obs_mirror_back_to_source_condition condition = {0};
    condition.http_error_code_returned_equals = "404";
    condition.key_prefix_equals = "image/";
    // 配置镜像回源规则
    obs_mirror_back_to_source_rule rule = {0};
    rule.id = "rule1";
    rule.condition = condition;
    rule.redirect = redirect;
    obs_response_handler response_handler = {&response_properties_callback, &response_complete_callback};
    obs_status ret_status = OBS_STATUS_BUTT;
    set_bucket_mirror_back_to_source(&options, &rule, 1, &response_handler, &ret_status);
    if (OBS_STATUS_OK == ret_status) {
        printf("set bucket mirror back to source successfully.\n");
    } else {
        printf("set bucket mirror back to source failed(%s).\n", obs_get_status_name(ret_status));
    }
    obs_deinitialize();
}
obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data)
{
    (void)properties; (void)callback_data;
    return OBS_STATUS_OK;
}
void response_complete_callback(obs_status status, const obs_error_details *error, void *callback_data)
{
    if (callback_data) { *(obs_status*)callback_data = status; }
    if (error && error->message) { printf("Error: %s\n", error->message); }
}
```
#### 相关链接
- 关于设置桶镜像回源规则的API说明，请参见[设置桶镜像回源规则](https://support.huaweicloud.com/api-obs/obs_04_0119.html)。
- 设置桶镜像回源规则过程中返回的错误码含义、问题原因及处理措施可参考[OBS错误码](https://support.huaweicloud.com/api-obs/obs_04_0115.html#section1)。
 
