当您将文件上传至OBS桶后,OBS会使用桶的默认域名自动生成文件的访问地址,使用浏览器访问该地址时,会强制下载文件。如果您不希望暴露桶的默认域名或希望在浏览器中可以在线预览文件,那么您可以为桶绑定自定义域名,通过自定义域名访问桶中的文件。
使用场景
- 域名可靠性增强:保护您的业务不受其他域名管控活动的干扰。当华为云基础域名( myhuaweicloud.com )为了保护数据安全被相关机构接管时,使用自定义域名可以避免您的业务访问受到不当影响。
- 文件预览:如果您不想强制下载文件,可以通过将自定义域名绑定至OBS桶实现在线预览文件。
- 保持访问链接不变:迁移网站文件或文件存储位置发生变化时,想保持网站各页面或各文件访问链接不变,可以将文件上传至OBS桶并为桶绑定自定义域名,实现网站域名和桶默认域名之间的映射,从而继续使用原链接访问文件。
- 提升品牌形象和专业度:使用固定的个性化的域名访问企业网站,可以增强企业形象和专业度,提升企业客户体验及对企业的信任度。
- 方便访问:使用简单便于记忆的自定义域名访问桶及桶中的文件,更轻松友好。
- 访问.apk或.ipa文件:基于安全合规要求,系统阻止通过桶默认域名下载.apk或.ipa文件,而为桶绑定自定义域名后,通过自定义域名访问.apk或.ipa文件不会被阻止。
原理介绍
使用自定义域名访问桶中对象和使用桶默认域名访问桶中对象的具体请求流程如下所示。
使用自定义域名访问桶中对象的具体请求流程如图1 使用自定义域名访问桶中对象的请求流程所示:
图1 使用自定义域名访问桶中对象
- 用户在浏览器中输入文件访问地址(带有自定义域名的地址)来发起访问请求。
- DNS将请求解析到桶默认域名。
- DNS通过桶默认域名解析请求到OBS服务器的IP地址。
- OBS返回服务器的IP地址给客户端。
- 客户端向OBS服务器IP地址发起Host为自定义域名的请求。
- OBS识别请求的Host为自定义域名,向客户端返回不带下载响应头的响应(Content-Disposition字段设置为inline)。
使用桶默认域名(bucketName.obs.endpoint.myhuaweicloud.com)访问桶中对象的请求流程如图2所示:
图2 使用桶默认域名访问桶中对象
- 用户在浏览器中输入文件访问地址(带有桶默认域名的地址)来发起访问请求。
- DNS通过桶默认域名解析请求到OBS服务器的IP地址。
- OBS返回服务器的IP地址给客户端。
- 客户端向OBS服务器IP地址发起Host为桶默认域名的请求。
- OBS识别请求的Host为桶默认域名,向客户端返回带下载响应头的响应(Content-Disposition字段设置为attachment)。
约束与限制
表1 约束与限制
限制类别 |
具体限制 |
桶版本限制 |
桶版本号为3.0及以上的桶支持配置自定义域名。桶版本号可以在OBS管理控制台上,进入桶概览页后,在“基本信息”中查看。 |
域名数量限制 |
每个桶默认最多配置20个自定义域名,部分区域支持最多配置100个自定义域名,各区域支持配置的最大值请以控制台自定义域名配置页面的实际规格为准。 |
功能限制 |
- 一个自定义域名只能配置到一个桶域名上。
- 暂不支持配置中文域名。
- 配置的自定义域名后缀目前支持的范围为2~6个英文大小写字母。
- 按照工信部要求,您配置自定义域名的桶所属区域如果为中国区域,那么需要提前完成ICP备案。
|
前提条件
- 已创建桶并上传对象。具体步骤请参见创建桶。
- 已有二级域名,支持绑定非华为云注册的域名。如果您还未注册域名,可以在华为云域名注册服务控制台注册域名,具体步骤请参见注册域名。
- 按照工信部要求,您配置自定义域名的桶所属区域如果为中国内地区域,那么需要提前完成ICP备案。
配置自定义域名
OBS支持通过控制台、API、SDK方式配置自定义域名,不支持通过OBS Browser+、obsutil方式配置自定义域名。
配置自定义域名分为如下三步:
- 绑定自定义域名:为桶绑定自定义域名。
- 配置CNAME域名解析:将自定义域名映射为被绑定桶的默认域名。
- (可选)配置HTTPS:使用HTTPS协议访问桶,提升域名访问的安全性。
使用OBS控制台
步骤一:绑定自定义域名
- 在OBS管理控制台左侧导航栏选择“桶列表”。
- 在桶列表中,单击待操作的桶,进入“对象”页面。
- 在左侧导航栏选择“基础配置>域名管理”,进入“域名管理”界面。
- 单击页面上方的“配置自定义域名”,右侧弹出“配置自定义域名”弹窗。
如果没有绑定自定义域名也可以在页面下方的配置自定义域名卡片中单击“配置自定义域名”。
图3 配置自定义域名

- 在“用户域名”中输入需要配置的自定义域名。
输入的域名规范如下:
- 首字符必须为“*”、字母或数字。
- 支持大小写字母、数字、“-”、“.”。
- 域名后缀支持的范围为2~6个英文大小写字母。如:.com、.cn。
每个桶默认最多配置20个自定义域名,部分区域支持最多配置100个自定义域名,各区域支持配置的最大值请以控制台自定义域名配置页面的实际规格为准。
如果您在填写用户域名时,需要OBS控制台为您呈现已有华为云域名,便于您在下拉列表中直接选择,则您需要拥有域名注册服务(Domains)的“Domains:domains:getDetails”权限,请联系管理员使用统一身份认证服务(IAM)为您授权。授权操作请参见给IAM用户授权。
- 单击“确定”。
步骤二:配置CNAME域名解析
配置解析CNAME,将自定义域名映射为被绑定桶的默认域名。
- 使用“一键解析”自动配置CNAME解析。
- 如果填写的用户域名为华为云域名,请单击“一键解析”。云解析服务DNS会根据填写的域名自动添加一条CNAME记录。
- 如果填写的用户域名非华为云域名,那么忽略本步骤而执行2手动配置解析规则。
- 手动配置解析CNAME。
- 如果您使用的域名为非华为云域名,请参考以下方式手动配置解析CNAME。
- 如果您使用的域名为华为云域名,可以通过如下步骤手动配置解析CNAME。
- 登录DNS控制台,进入云解析服务页面。
- 在左侧菜单栏中,选择“公网域名”,进入域名列表页面。
- (可选)创建公网域名。如果您之前已创建,请跳过该步骤。
- 在“公网域名”页面,单击右上角的“创建公网域名”。
- 根据提示填写参数配置,参数信息如下所示,其余参数保持默认。
表2 参数说明
参数 |
取值样例 |
参数说明 |
域名 |
example.com |
从域名注册商处购买的域名。
此处填写的是为桶绑定的自定义域名。 |
企业项目 |
default |
公网域名关联的企业项目,用于将公网域名资源按照企业项目进行管理。
仅当用户使用的“账号类型”为“企业账号”时,显示该参数,且参数必选。
配置原则:
- 如果不通过企业项目管理域名资源,则采用默认值“default”。
- 如果通过企业项目管理域名资源,则在下拉列表中选择已经创建的企业项目。
在设置该参数前,您需要创建企业项目。
|
- 单击“确定”。
- 在待添加记录集的域名(为桶绑定的自定义域名)所在行,单击“域名”列的域名名称。
- 进入“解析记录”页面,单击“添加记录集”,进入“添加记录集”页面。
- 根据界面提示填写参数配置,参数信息如表3所示,表中未提到的参数可保持默认值。
更多参数配置请参见
添加CNAME类型记录集。
表3 参数说明
参数 |
取值样例 |
参数说明 |
记录类型 |
CNAME-将域名指向另外一个域名 |
根据域名解析场景选择记录集的类型。
此处选择“CNAME-将域名指向另外一个域名”类型。
添加记录集时,如果提示解析记录集已经存在,说明待添加的记录集与已有的记录集存在限制关系或者冲突。
详细内容请参见为什么会提示解析记录集已经存在?。 |
主机记录 |
置空 |
解析域名的前缀。
例如创建的域名为“example.com”,其“主机记录”设置包括:
|
线路类型 |
全网默认 |
解析的线路类型用于DNS服务器在解析域名时,根据访问者的来源,返回对应的服务器IP地址。
默认值为“全网默认”。
仅支持为公网域名的记录集配置此参数。
- 全网默认:默认线路类型,当未根据访问者来源设置解析线路时,系统会返回默认解析结果。
- 运营商线路解析:根据访问者所在运营商,设置解析线路,详细内容请参见配置运营商线路解析。
- 地域解析:根据访问者所在地域,设置解析线路,详细内容请参见配置地域线路解析。
- 自定义线路:根据访问者所属IP网段,设置解析线路,详细内容请参见配置自定义线路解析。
|
TTL(秒) |
300秒 |
解析记录在本地DNS服务器的缓存时间,以秒为单位。
默认值为“300秒”。取值范围为:1~2147483647
如果您的服务地址经常更换,建议TTL值设置相对小些,反之,建议设置相对大些。
更多TTL相关内容请参见什么是TTL值?。 |
记录值 |
example-bucket.obs.cn-north-4.myhuaweicloud-custom.com |
填写您要指向的别名,只能填写一个域名。
|
别名 |
开关关闭 |
用于是否将此记录集关联至云服务资源实例。
仅支持为公网域名的记录集配置此参数。
与CNAME记录集相比,别名支持一级主域名。
CNAME类型记录集不支持打开别名开关。 |
- 单击“确定”,完成添加。
- 验证CNAME域名解析是否生效。
打开Windows操作系统中的cmd程序,输入如下命令:
nslookup -qt=cname 桶配置的自定义域名或CDN加速域名
- 没有使用CDN加速:如果回显OBS桶域名,则表示CNAME域名解析已经生效。
图4 未使用CDN加速
- 使用CDN加速:如果回显CDN分配的CNAME域名,则表示CNAME域名解析已经生效,如下图所示。
图5 使用CDN加速
步骤三:(可选)配置HTTPS
- 完成CNAME域名解析后,在“配置自定义域名”弹窗中的“解析CNAME”步骤,单击“下一步”。
- (可选)在“推荐配置(HTTPS)”页面,如果您不需要配置HTTPS,单击右下角的“我已了解”。
- (可选)如果您需要配置HTTPS,按照表4配置参数。
表4 自定义域名的HTTPS配置
参数名称 |
参数说明 |
自定义域名 |
选择需要配置HTTPS证书的自定义域名。 |
证书 |
选择需要使用的SCM证书,即云证书管理服务(CCM)提供的服务器数字证书。
证书存在过期时间,请确保您选择的证书未过期。
证书到期时,请及时更换证书,否则可能对业务造成影响。 |
- 单击右下角的“配置”。
使用SDK
Java暂不支持 |
Python暂不支持 |
C |
Go |
BrowserJS暂不支持 |
.NET暂不支持 |
Android暂不支持 |
iOS暂不支持 |
PHP暂不支持 |
Node.js暂不支持 |
使用自定义域名访问对象
为桶绑定自定义域名且解析生效后,验证是否可以通过自定义域名访问对象。OBS支持通过控制台、SDK方式使用自定义域名访问对象,不支持通过API、OBS Browser+、obsutil方式使用自定义域名访问对象。
使用OBS控制台
- 在OBS管理控制台左侧导航栏选择“桶列表”。
- 在桶列表中,单击待操作的桶,进入“对象”页面。
- 选中待分享的文件,并单击右侧操作列的“分享”。
- 在“分享文件”弹窗,设置相关参数。
图6 分享文件
表5 分享文件参数说明
参数名称 |
说明 |
URL有效期 |
文件URL的有效时间,超过有效期链接将失效。
- URL有效期范围为1分钟~18小时,有效期内任何用户都可以通过URL直接访问该对象。如果要分享有效期时长更长的链接,建议使用OBS Browser+工具。
- 该弹窗打开时,链接信息已生效并开始计时,有效期默认为5分钟。修改URL有效期后会重新开始计时,同时链接信息会相应变化,您需要重新复制链接信息。
|
用户协议 |
分享的链接使用的用户协议。默认为“https”。
如果您为自定义域名配置了HTTPS,建议您选择“https”。
- http:适用于对安全性要求不高的场景。
- https:适用于对安全性要求较高的场景。https通过SSL/TLS 协议对数据进行加密传输,保证数据的机密性和完整性;同时会基于证书验证服务器的身份,防止被攻击。
|
自定义域名 |
选择分享链接是否使用自定义域名。此处选择为桶绑定的自定义域名,即分享的链接信息为使用自定义域名拼接成的链接。
- 由于内容分发网络(CDN)是实现公网的访问加速(任何用户均可访问CDN),因此如果自定义域名开启了CDN加速后,可能会造成分享链接永不超期,即任何用户在任何时间均可以访问对象。
- 如果自定义域名开启了CDN加速且在配置CDN节点缓存规则时,配置了忽略URL参数(CDN缓存时忽略请求URL中“?”之后的参数),将会导致分享链接无效。
说明:
分享链接信息中“?”后面的为鉴权信息,因此鉴权信息被忽略后,分享链接将会失效。
|
- 分享对象。
- 单击“打开URL”,将在新页面打开对象进行预览。
- 单击“复制链接”,您可以将该链接分享给其他用户,用户可以在浏览器中通过此链接直接访问该对象。
使用SDK
- 获取预签名URL。
以下为常用语言的示例代码:
- Java
import com.obs.services.ObsClient;
import com.obs.services.ObsConfiguration;
import com.obs.services.model.HttpMethodEnum;
import com.obs.services.model.TemporarySignatureRequest;
import com.obs.services.model.TemporarySignatureResponse;
public class GetObject001 {
public static void main(String[] args) {
// 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。
// 您可以登录访问管理控制台获取访问密钥AK/SK
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
// 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。
// 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。使用临时访问密钥调用接口可将下面一行的注释取消。
// String securityToken = System.getenv("SECURITY_TOKEN");
// endpoint填写桶的自定义域名,如果配置了自定义域名证书,可以修改为https。
String endPoint = "http://example.domain";
// 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。
//String endPoint = System.getenv("ENDPOINT");
ObsConfiguration obsConfiguration = new ObsConfiguration();
obsConfiguration.setCname(true);
obsConfiguration.setEndPoint(endPoint);
try {
// 创建ObsClient实例
// 使用永久AK/SK初始化客户端
ObsClient obsClient = new ObsClient(ak, sk, obsConfiguration);
// 使用临时AK/SK和SecurityToken初始化客户端
// ObsClient obsClient = new ObsClient(ak, sk, securityToken, obsConfiguration);
// URL有效期,3600秒
long expireSeconds = 3600L;
TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);
request.setBucketName("examplebucket");
request.setObjectKey("objectname");
TemporarySignatureResponse response = obsClient.createTemporarySignature(request);
System.out.println("Getting object using temporary signature url:");
System.out.println("SignedUrl:" + response.getSignedUrl());
} catch (Exception e) {
System.out.println("create temporary signature failed");
e.printStackTrace();
}
}
}
- Python
from obs import ObsClient
import os
import traceback
# 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
# 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
ak = os.getenv("AccessKeyID")
sk = os.getenv("SecretAccessKey")
# 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取
# security_token = os.getenv("SecurityToken")
# server填写桶的自定义域名,如果配置了自定义域名证书,可以修改为https。
server = "http://example.domain"
# 创建obsClient实例
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server, is_cname=True)
# 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值
#obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, security_token=security_token, server=server, is_cname=True)
try:
# 生成下载对象的带授权信息的URL
res = obsClient.createSignedUrl(method='GET', bucketName='bucketname', objectKey='objectkey', expires=3600)
print('signedUrl:', res.signedUrl)
except:
print(traceback.format_exc())
- 使用浏览器访问预签名URL。
相关文档
使用CDN加速功能提高访问速度
如果您希望提高访问静态资源文件的速度和稳定性,可以使用CDN加速。如果您已为桶配置自定义域名,那么可以直接为自定义域名开启CDN加速;如果您还未为桶配置自定义域名,那么可以配置CDN加速域名。具体操作请参见通过CDN加速域名访问桶。
您还可以使用CDN,通过CDN管理控制台进行HTTPS证书管理,即可使用HTTPS访问。CDN管理控制台HTTPS证书管理方式,详情请参见HTTPS配置。
使用不带签名且长期有效的URL访问对象
- 如果您需要获取不存在签名和过期时间的访问对象URL(http://DomainName/ObjectName),那么您需要将文件权限设置为公共读。设置为公共读后,任何用户都可以访问该文件,这可能造成您的数据泄露及因为访问请求而造成的费用激增。因此,建议您使用携带签名和过期时间的URL访问文件。
- 如果您设置了不带签名和没有过期时间的URL访问对象,为了防止文件被盗用,建议您配置防盗链。
您可以通过以下两种方式将对象设置为公共读:
- 通过将对象权限设置为匿名用户读取权限,通过分享对象URL,匿名用户通过分享的链接地址可访问对象数据。设置权限请参见对匿名用户授予指定对象的公共读权限。
- 为已配置的自定义域名开启加速:保持OBS桶中的对象权限为私有,通过CDN提供公共读访问。此种情况下,对象的URL将无需签名认证且没有有效期,匿名用户均可访问。
防止OBS桶中的数据被盗用
一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。因此,产生了防盗链技术。
如果您希望避免存储在OBS桶中的数据被其他人盗用,可以通过设置HTTP Header中表头字段Referer列表(包括白名单Referer、黑名单Referer、空Referer)的方式,来限制您的桶内资源的访问来源。具体步骤请参见配置防盗链防止非法流量盗用。
托管静态网站
如果您希望将您的静态网站托管到OBS,并使用自定义域名访问,您需要为存储空间设置静态网站托管。具体步骤请参见静态网站托管。