静态网站托管
使用场景
OBS服务允许在桶上托管静态网站,支持索引页、错误页展示和页面跳转。您可以将静态网站文件上传至OBS的桶中,并对这些文件赋予匿名用户可读权限,然后将该桶配置成静态网站托管模式,就可以实现在OBS上托管静态网站了。
静态网站通常仅包含静态网页,以及可能包含部分可在客户端运行的脚本,如JavaScript、Flash等。相比之下,动态网站则依赖于服务器端处理脚本,包括PHP、JSP或ASP.Net等。OBS当前尚不支持服务器端运行脚本。
在设置了静态网站托管后,有以下两种方式访问OBS。
- 资源管理方式:资源管理方式通过普通的域名访问OBS。您可以使用API及SDK方式,结合带有终端节点(Endpoint)的OBS默认域名,实现普通的上传、下载、删除、列举等桶和对象操作。
- 静态网站方式:静态网站方式通过特定的域名访问OBS。使用静态网站访问时,根据配置好的域名托管规则,实现访问目录的索引页、错误页展示和访问页面资源的跳转。
修改静态网站托管设置后会在两分钟内生效,静态网站托管设置生效后,用户可以通过如下形式的网址访问静态资源:
https://静态网站访问域名/对象名 http://静态网站访问域名/对象名
其中静态网站访问域名的结构为:BucketName.obs-website.Endpoint,其中BucketName为桶名,Endpoint为终端节点,各区域的终端节点详情请参见地区和终端节点。例如您想使用静态访问域名访问位于华北-北京四的名为testbucket桶,华北-北京四的Endpoint为cn-north-4.myhuaweicloud.com,则此时对应的静态网站访问域名应该为testbucket.obs-website.cn-north-4.myhuaweicloud.com。
- 尽量避免目标桶名中带有“.”,否则通过HTTPS访问时可能出现客户端校验证书出错。
- 静态网站托管场景需要设置匿名用户访问权限,当匿名用户访问静态网站文件时,会产生公网流出流量费用和请求费用。
为了使您的客户可以访问网站终端节点上的内容,您必须使您的所有内容公开可读。这样,您可以使用对象上的桶策略或ACL来授予必要的权限。
资源管理方式和静态网站方式之间的主要差异如下:
主要差异 |
资源管理方式 |
静态网站方式 |
---|---|---|
访问控制 |
同时支持公共内容和私有内容 |
仅支持公开可读的内容 |
错误消息处理 |
返回XML格式的错误响应 |
返回HTML文档 |
重定向支持 |
不适用 |
同时支持对象级和桶级重定向 |
支持的请求 |
支持所有桶和对象操作 |
仅支持对象上的GET和HEAD请求 |
对桶根级的GET和HEAD请求的响应 |
返回桶中对象key的列表 |
返回配置中指定的索引文档 |
注意事项
基于安全合规要求,华为云对象存储服务OBS禁止通过OBS的默认域名(桶访问域名或静态网站访问域名)使用静态网站托管功能,即使用上述域名从浏览器访问网页类型文件时,不会显示对象内容,而是以附件形式下载。
各区域将自以下两个时间点起生效:
自2022年1月1日起生效:华北-北京一、华北-北京四、华北-乌兰察布一、华东-上海一、华东-上海二、华南-广州、西南-贵阳一
自2022年3月25日起生效:中国-香港、亚太-曼谷、亚太-新加坡、非洲-约翰内斯堡、拉美-墨西哥城一、拉美-墨西哥城二、拉美-圣保罗一、拉美-圣地亚哥
通过自定义域名使用静态网站托管功能不受影响,仍然支持文件内容的直接预览,详情请参见如何在浏览器中在线预览OBS中的对象?
如果OBS桶开启了静态网站托管功能的同时要配置CDN加速,请在配置CDN加速域名时勾选“静态网站托管”,这样用户访问单个静态文件时就不会列出桶中所有文件列表。同时,请在CDN域名的源站配置页面勾选“静态网站托管”。具体请参见为什么OBS桶接入CDN后,访问域名会列出所有文件列表?
设置静态网站托管
概述
如果要为静态网站托管配置桶,则要将网站配置添加到桶。该配置包含以下信息:
索引文档
当您键入诸如http://example.com的URL时,您不是在请求特定的页面。在这种情况下,Web服务器将提供默认页面,该页面包含存储了请求的网站内容的目录。此默认页面称为索引文档,大多数情况下,它被命名为index.html。当您为网站托管配置桶时,您必须指定索引文档。当对根域或任何子文件夹发出请求时,OBS将返回此索引文档。
错误文档
如果出现错误,则OBS将返回HTML错误文档。对于4XX类错误,您可以选择性地提供您自己的自定义错误文档,您可以在该文档中向您的用户提供其他指南。
重定向所有请求
如果根域为example.com,且您需要响应对http://example.com和http://www.example.com的请求,则可以创建名为example.com和www.example.com的两个桶,仅在一个桶中保留网站内容(如example.com),将另一个桶配置为将所有请求重定向到example.com桶。
高级条件重定向
您可以根据请求中的特定对象名称或前缀,或者根据响应代码按条件对请求进行重定向。例如,假设您在桶中删除或重命名了某个对象。您可以添加一个将请求重定向到其他对象的路由规则。
通过设置重定向规则特定请求,设置语法格式如下:
<WebsiteConfiguration> <IndexDocument> <Suffix>index.html</Suffix></IndexDocument> <ErrorDocument> <Key>SomeErrorDocument.html</Key> </ErrorDocument> <RoutingRules> ……RoutingRules…… </RoutingRules> </WebsiteConfiguration>
RoutingRules语法格式如下,中括号[]中的内容为可选项:
<RoutingRules> = <RoutingRules> <RoutingRule>...</RoutingRule> [<RoutingRule>...</RoutingRule> ...] </RoutingRules> <RoutingRule> = <RoutingRule> [ <Condition>...</Condition> ] <Redirect>...</Redirect> </RoutingRule> <Condition> = <Condition> [ <KeyPrefixEquals>...</KeyPrefixEquals> ] [ <HttpErrorCodeReturnedEquals>...</HttpErrorCodeReturnedEquals> ] </Condition> <Redirect> = <Redirect> [ <HostName>...</HostName> ] [ <Protocol>...</Protocol> ] [ <ReplaceKeyPrefixWith>...</ReplaceKeyPrefixWith> ] [ <ReplaceKeyWith>...</ReplaceKeyWith> ][ <HttpRedirectCode>...</HttpRedirectCode> ] </Redirect>
重定向所有请求Website配置元素和设定重定向规则Website配置元素,详情请参见设置桶的网站配置请求消息元素。
以下是一些示例:
例1:修改对象名前缀进行重定向
假设您的桶包含了以下对象:
index.html
docs/article1.html
docs/article2.html
现在,您决定将该文件夹从docs/重命名为documents/。修改后,将需要对前缀/docs的请求重定向到documents/。例如,对docs/article1.html的请求需要重定向到documents/article1.html。
在这种情况下,您可以将以下路由规则添加到网站配置中:
<RoutingRules> <RoutingRule> <Condition> <KeyPrefixEquals>docs/</KeyPrefixEquals> </Condition> <Redirect> <ReplaceKeyPrefixWith>documents/</ReplaceKeyPrefixWith> </Redirect> </RoutingRule> </RoutingRules>
例2:把发往已删除的文件夹的请求重定向到指定页面
假设您删除了images/文件夹(即,您删除了对象名前缀为images/的所有对象)。您可以添加路由规则,该规则将把对象名前缀为images/的所有对象的请求重定向到名为folderdeleted.html的页面。
<RoutingRules> <RoutingRule> <Condition> <KeyPrefixEquals>images/</KeyPrefixEquals> </Condition> <Redirect> <ReplaceKeyWith>folderdeleted.html</ReplaceKeyWith> </Redirect> </RoutingRule> </RoutingRules>
例3:为HTTP错误进行重定向
假设在未找到请求的对象时,需要将请求重定向到www.example.com。您可以添加重定向规则,以便当返回HTTP状态代码404(未找到)时,站点访问者可重定向到www.example.com。以下示例也将在重定向中插入对象名前缀report-404/。例如,如果您请求页面ExamplePage.html,且它导致了HTTP 404错误,该请求将重定向到www.example.com上的页面report-404/ExamplePage.html。如果没有路由规则,且发生了HTTP错误404,将返回在配置中指定的错误文档。
<RoutingRules> <RoutingRule> <Condition> <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals > </Condition> <Redirect> <HostName>www.example.com</HostName> <ReplaceKeyPrefixWith>report-404/</ReplaceKeyPrefixWith> </Redirect> </RoutingRule> </RoutingRules>
索引文档支持
索引文档是当对网站的根或任何子文件夹发出请求时返回的网页。例如,如果用户在浏览器中输入http://www.example.com,则该用户没有请求任何特定页面。在这种情况下,OBS将提供索引文档,该文档有时也称为默认页面。
当您将您的桶配置为网站时,您应该提供索引文档的名称。您必须上传具有此名称的对象并将其配置为公开可读。
根级URL的尾部斜杠是可选的。例如,如果您将具有index.html的网站配置为索引文档,以下任意一个URL将返回index.html。
http://bucketname.obs-website.example.com/ http://bucketname.obs-website.example.com
在OBS中,对象在桶中是水平存储的;它不会像计算机上的文件系统那样提供任何分层组织。您可以通过使用表示文件夹结构的对象名称创建逻辑层级结构。例如,考虑具有三个对象的桶和以下对象名。
- sample1.jpg
- photos/2006/Jan/sample2.jpg
- photos/2006/Feb/sample3.jpg
虽然它们没有按任何物理分层组织进行存储,但您可以从对象名推断以下逻辑文件夹结构。
- sample1.jpg对象位于桶的根级
- sample2.jpg对象位于photos/2006/Jan子文件夹中。
- sample3.jpg对象位于photos/2006/Feb子文件夹中。
自定义错误文档支持
表1列出了发生错误时OBS返回的HTTP响应代码的子集。
HTTP错误代码 |
说明 |
---|---|
301 永久移动 |
当用户将请求直接发送到OBS网站终端节点时,OBS返回301 Moved Permanently (301 永久移动)响应。 |
302 Found (302 已找到) |
当OBS收到对不包含尾部斜杠的键x的请求时,它首先查找键名称为x的对象。如果未找到对象,则OBS确定该请求是针对子文件夹x发出的,并通过在末尾添加斜杠重定向请求并返回302 Found (302 已找到)。 |
304 Not Modified (304 未修改) |
OBS用户请求标头If-Modified-Since、If-Unmodified-Since以确定所请求的对象是否与客户端保存的缓存副本相同。如果对象相同,网站终端节点将返回304 Not Modified响应。 |
403 禁止访问 |
当用户请求转换为不可公开读取的对象时,网站终端节点的响应包含403 Forbidden。对象所有者必须使用桶策略或ACL使该对象公开可读。 |
404 未找到 |
由于以下原因,网站终端节点的响应包含404 Not Found:
您可以创建为404 Not Found返回的自定义文档。确保该文档已上传到配置为网站的桶,且网站托管配置已设置为使用该文档。 |
500 Service Error |
当出现内部服务器错误时,网站终端节点的响应包含500 Service Error。 |
503 服务不可用 |
当OBS确定您需要降低请求频率时,网站终端节点的响应包含503 Service Unavailable (503 服务不可用)。 |
网站访问所需的权限
当您将桶配置为网站时,您必须使要提供的对象公开可读。要执行此操作,您需要编写向每个人授予GetObject权限的桶策略。在网站终端节点上,如果用户请求的对象不存在,则OBS返回HTTP响应代码404 (Not Found)。如果该对象存在,但您未授予对对象的读取权限,则网站终端节点将返回HTTP响应代码403 (Access Denied)。用户可以使用该响应代码推断特定对象是否存在。如果您不需要此行为,则不要启用对桶的网站支持。
静态网站托管场景需要设置匿名用户访问权限,当匿名用户访问静态网站文件时,会产生公网流出流量费用和请求费用。
以下示例桶策略向每个人授予了访问指定文件夹中的对象的权限。有关桶策略的更多信息,请参见桶策略。
{ "Statement":[{ "Sid":"PublicReadGetObject", "Effect":"Allow", "Principal": {"ID":"*"}, "Action":["GetObject"], "Resource":["example-bucket/*" ] } ] }
桶策略仅适用于桶拥有者拥有的对象。如果桶包含非桶拥有者拥有的对象,则应使用对象ACL对这些对象授予公有READ权限。
您可以通过桶策略或对象ACL授予对您的对象的公开读取权限。如果要使用ACL使对象公开可读,您可以向Everyone授予READ权限,如以下授权元素所示。您可以将此授权元素添加到对象ACL。有关管理ACL的信息,请参见ACL权限控制方式。
<Grant> <Grantee> <Canned>Everyone</Canned> </Grantee> <Permission>READ</Permission> </Grant>
与其他功能的关系
功能 |
静态网站托管与该功能的关系 |
参考文档 |
---|---|---|
跨域资源共享 |
默认情况下,托管在OBS的静态网站仅允许响应同域网站的访问请求。通过对保存静态网站资源的OBS桶进行跨域资源共享配置,可以实现跨域访问功能。 |
|
自定义域名配置 |
OBS支持通过自定义域名访问托管在OBS上的静态网站,用户无需修改网站代码,即可使用原域名访问网站。 |
|
CDN加速 |
默认情况下,用户访问托管在OBS的静态网站是通过URL直接从OBS请求数据。一般情况下文件只存储在一个区域,不同区域的用户访问OBS的响应速度存在差异。在需要频繁访问的场景下,直接访问OBS来获取相应文件,还会消耗大量的流量费用。为提升用户访问体验,且降低存储成本,可以选择通过CDN加速访问静态网站。 |
|
防盗链 |
用户将网站托管在OBS后,为了防止网站数据被其他人盗链,OBS支持基于HTTP header中表头字段referer的防盗链方法。 |
前提条件
静态网站所需的网页文件已上传到指定桶中。
桶内的静态网站文件必须配置为所有用户可访问。
如果静态网站文件为“归档存储”或“深度归档存储”类别,则需要先恢复,具体操作步骤请参见恢复归档或深度归档存储对象。
使用方式
OBS支持通过控制台、API、SDK方式配置静态网站托管,不支持通过OBS Browser+、obsutil方式配置静态网站托管。