更新时间:2024-10-26 GMT+08:00
分享

静态网站托管

使用场景

OBS服务允许在桶上托管静态网站,支持索引页、错误页展示和页面跳转。您可以将静态网站文件上传至OBS的桶中,并对这些文件赋予匿名用户可读权限,然后将该桶配置成静态网站托管模式,就可以实现在OBS上托管静态网站了。

静态网站通常仅包含静态网页,以及可能包含部分可在客户端运行的脚本,如JavaScript、Flash等。相比之下,动态网站则依赖于服务器端处理脚本,包括PHP、JSP或ASP.Net等。OBS当前尚不支持服务器端运行脚本。

图1 静态网站示意图

在设置了静态网站托管后,有以下两种方式访问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响应代码的子集。

表1 错误码列表

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

  • OBS确定网站URL引用了不存在的对象键
  • OBS推断该请求针对不存在的索引文档
  • 在URL中指定的桶不存在
  • 在URL中指定的桶存在,但它未配置为网站

您可以创建为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桶进行跨域资源共享配置,可以实现跨域访问功能。

配置CORS实现跨域访问OBS

自定义域名配置

OBS支持通过自定义域名访问托管在OBS上的静态网站,用户无需修改网站代码,即可使用原域名访问网站。

配置自定义域名

使用自定义域名托管静态网站

CDN加速

默认情况下,用户访问托管在OBS的静态网站是通过URL直接从OBS请求数据。一般情况下文件只存储在一个区域,不同区域的用户访问OBS的响应速度存在差异。在需要频繁访问的场景下,直接访问OBS来获取相应文件,还会消耗大量的流量费用。为提升用户访问体验,且降低存储成本,可以选择通过CDN加速访问静态网站。

配置加速域名

使用自定义域名托管静态网站

通过CDN加速访问OBS

防盗链

用户将网站托管在OBS后,为了防止网站数据被其他人盗链,OBS支持基于HTTP header中表头字段referer的防盗链方法。

配置防盗链防止非法流量盗用

前提条件

静态网站所需的网页文件已上传到指定桶中。

桶内的静态网站文件必须配置为所有用户可访问。

如果静态网站文件为“归档存储”或“深度归档存储”类别,则需要先恢复,具体操作步骤请参见恢复归档或深度归档存储对象

使用方式

OBS支持通过控制台、API、SDK方式配置静态网站托管,不支持通过OBS Browser+、obsutil方式配置静态网站托管。

相关文档