浏览器缓存,缓存机制一贰3

HTTP 缓存机制一二3

2017/10/18 · HTML5 · 4
评论 ·
缓存

初稿出处: 阿咩   

美高梅开户网址 1Web
缓存差不离能够分成:数据库缓存、服务器端缓存(代理服务器缓存、CDN
缓存)、浏览器缓存。

浏览器缓存也饱含众多剧情: HTTP 缓存、indexDB、cookie、localstorage
等等。这里我们只谈谈 HTTP 缓存相关内容。

在切切实实明白 HTTP 缓存以前先来深入人心多少个术语:

  • 缓存命中率:从缓存中获得数码的央浼数与富有请求数的比值。理想图景是越高越好。
  • 过期内容:超越设置的管事时间,被标志为“陈旧”的始末。经常过期内容不能够用来复苏客户端的请求,必须再一次向源服务器请求新的剧情如故注脚缓存的始末是不是还是筹算。
  • 注解:验证缓存中的过期内容是不是依旧有效,验证通过的话刷新过期时间。
  • 失效:失效即是把内容从缓存中移除。当内容发生退换时就必须移除失效的内容。

浏览器缓存首若是 HTTP 协议定义的缓存机制。HTML meta 标签,举个例子

JavaScript

<META HTTP-EQUIV=”Pragma” CONTENT=”no-store”>

1
<META HTTP-EQUIV="Pragma" CONTENT="no-store">

意义是让浏览器不缓存当前页面。可是代理服务器不解析 HTML
内容,一般选用分布的是用 HTTP 头新闻调整缓存。

强缓存

Web缓存分为很七种,比方数据库缓存,代理服务器缓存,还有大家耳熟能详的CDN缓存,以及浏览器缓存。

浏览器缓存调控,浏览器缓存

浏览器缓存调节

浏览器缓存,缓存机制一贰3。Last-Modified/ If-Modified-Since

在浏览器第三遍呼吁某2个U昂CoraL时,服务器端的回到状态码200,内容是客户端请求的财富,同时有一个Last-Modified的质量标识此文件在服务器端最终被改换的岁月。

Last-Modified格式类似那样:Last-Modified : Fri , 1二 May 200陆 1八:5叁:33林大霉素T

客户端第三遍呼吁此U奥迪Q伍L时,依据HTTP协议的鲜明,浏览器会向服务器传送If-Modified-Since报头,询问该时间以往文件是还是不是有被修改过:

If-Modified-Since : Fri , 12 May 2006 18:53:33 GMT

假如服务器端的财富未有变化,则自动回到 HTTP 30四(Not
Changed.)状态码,内容为空,那样就省去了传输数据量。当服务器端代码爆发改造照旧重启服务器时,则再一次发出财富,重临和率先次呼吁类似。从而确定保障不向客户端重复产生产资料源,也保障当服务器有变化时,客户端能够获得最新的能源。

Last-Modified的问题

①、一些文件会被编辑,但剧情并没有改观,那一年不愿意客户端认为那么些文件被涂改了,而再一次获得财富。

二、有个别文件修改十三分频仍,比方在秒以下的大运内进行修改,If-Modified-Since不能检查到。

3、有个别服务器不能够标准的获取文件的末段修改时间。

 

Expires

Expires用来调整缓存失效的日期。当浏览器看到响应中有二个Expires头时,它会和相应的组件一齐保存到其缓存中,只要组件未有过期,浏览器就会动用缓存版本而不会实行别的的HTTP请求。永世的Expires头适用于图片等不平日更新的财富。Expires设置的日子格式必须为核糖霉素T(格林尼治标准时间)。

Expires:Wed, 11 Jan 2017 08:10:26 GMT

Expires的不足:

先是,Expires头使用的是三个特定的岁月,供给客户端和服务器端的石英表严谨同步。尽管服务器和客户端的小时不合并,那有极大概率出现缓存提前失效的图景,存在不稳定性。其次,假使Expires的日子到来,供给在服务器配置中再提供三个新的日子。

 

Cache-Control

HTTP1.一引进了Cache-Control头来克服Expires头的供不应求。Cache-Control使用max-age制定组件被缓存多短时间,以秒为单位。举例

Cache-Control:max-age=3600意味组件将被缓存56分钟。

要是max-age和Expires同时出现,则max-age有越来越高的预先级,浏览器会基于max-age的小时来认同缓存过期光阴。

常用 cache-directive 值

Cache-directive

说明

public

不无内容都将被缓存(客户端和代理服务器都可缓存)

private

内容只缓存到村办缓存中(仅客户端能够缓存,代理服务器不可缓存),默许值

no-cache

务必先与服务器确认再次来到的响应是还是不是被转移,然后才具采纳该响应来满意三番五次对同3个网站的伸手。因而,假如存在妥善的注脚确命令牌
(ETag),no-cache
会发起往返通讯来证实缓存的响应,假使财富未被转移,可防止止下载。

no-store

具有内容都不会被缓存到缓存或 Internet 一时半刻文件中

must-revalidation/proxy-revalidation

假若缓存的剧情失效,请求必须发送到服务器/代理以拓展再次验证

max-age=xxx (xxx is numeric)

缓存的始末将要 xxx 秒后失效, 这么些选项只在HTTP
1.1可用
。假若和Last-Modified一齐行使时, 优先级较高

 

浏览器的两样操作

开采新窗口

倘诺钦定cache-control的值为private、no-cache、must-revalidate,那么伸开新窗口访问时都会再也访问服务器。而只要钦定了max-age值,那么在此值内的年华里就不会再度访问服务器,比如:Cache-control:
max-age=5 表示当访问此网页后的伍秒内不会去重新访问服务器.

在地方栏回车

假使值为private或must-revalidate,则只有首先次访问时会访问服务器,以往就不再访问。就算值为no-cache,那么每便都会访问。若是值为max-age,则在逾期事先不会再也访问。

按后退按扭

1经值为private、must-revalidate、max-age,则不会重访问,而假诺为no-cache,则每一回都再也访问.

按刷新按扭

随意为什么值,都会再度访问.

 

Etag(Entity Tag)

服务器在检查测试缓存的机件是或不是和原始服务器上的零件相称时有三种办法:

(壹)对比近期涂改日期;Last-Modified/If-Modified-since

(一)相比实体标签;Etag/If-None-Match(优先级比If-Modified-since高)

实业标签,是web服务器和浏览器用于确认缓存组件的实用的一种体制。

           ETag:”50b1c1d4f775c61:df3″

第2回呼吁时:

壹.客户端发起HTTP GET 请求二个能源;

二.服务器处理请求,重临财富,蕴含Http Etag和状态码200

第一遍呼吁时:

一.客户端发起 HTTP GET
请求3个文件,请求中包罗三个If-None-Match头,内容便是率先次呼吁时服务器重返的Etag的值

二.服务器推断接受到的Etag和计算出来的Etag是还是不是配合。若相配,重回30四状态码,客户端继续使用本地的缓存。若不相配,再次回到资源和新的ETag。

ETag带来的主题材料

ETag常常选用组件的一点质量来布局它,这一个属性对于特定的过夜了网址服务器来讲是绝无仅有的。当浏览器从1台服务器上获取了土生土长组件,之后又向此外1台差别的服务器发起条件GET请求时,ETag是不会协作的。

对组件进行不要求的再度加载还会影响服务器的习性并扩展带宽费用。假若您的Round罗布in
Rotation集群中有n台服务器,下二次用户缓存中的Etag能和服务器相称的票房价值是1/n。Etag还会下落代理缓存的频率,因为代理的与本人的不相称会重新下载。

HTTP响应优化

移除ETag,Expires,使用Cache-Control调节地点缓存。

浏览器缓存控制Last-Modified/ If-Modified-Since
在浏览器首回呼吁某1个UOdysseyL时,服务器端的回到状态码200,内容…

HTTP 头新闻调控缓存

大致分成二种:强缓存和磋商缓存。强缓存假设命中缓存不要求和劳务器端发生相互,而协商缓存不管是或不是命中都要和劳动器端爆发相互,强制缓存的先行级高于协商缓存。具体内容下文介绍。

匹配流程(已有缓存的景观下):

美高梅开户网址 2

能够通晓为无须验证的缓存计谋。对强缓存来讲,响应头中有五个字段
Expires/Cache-Control 来注解规则。

缓存的严重性不用多说了呢,举个例子chrome会把缓存的文本保留在1个叫User
Data的公文夹下,下次页面加载同样财富时,能够直接从本地读取,不必经过HTTP从服务器端再一次下载资源,大大加速了页面包车型客车响应速度。

强缓存

能够清楚为无须验证的缓存战略。对强缓存来讲,响应头中有多少个字段
Expires/Cache-Control 来注脚规则。

Expires

Expires
指缓存过期的时刻,超越了那一个日子点就意味着财富过期。有三个标题是出于使用具体日子,借使时间表示出错或然尚未改产生科学的时区都只怕引致缓存生命周期出错。并且
Expires 是 HTTP/一.0 的科班,现在更倾向于用 HTTP/1.一 中定义的
Cache-Control。三个同时存在时也是 Cache-Control 的优先级越来越高。

Cache-Control

Cache-Control 能够由多少个字段组合而成,主要有以下多少个取值:

  1. max-age
    钦点四个岁月长短,在这几个时刻段内缓存是有效的,单位是s。比如设置
    Cache-Control:max-age=31536000,也正是说缓存限期为(3153五千 / 二肆 / 60
    * 60)天,第3遍访问那么些财富的时候,服务器端也回到了 Expires
    字段,并且过期时间是一年后。

美高梅开户网址 3

在尚未禁止使用缓存并且未有当先有效时间的意况下,再度访问这些能源就命中了缓存,不会向服务器请求财富而是一直从浏览器缓存中取。

美高梅开户网址 4

  1. s-maxage 同 max-age,覆盖
    max-age、Expires,但仅适用于共享缓存,在个体缓存中被忽略。

  2. public
    注解响应得以被此外对象(发送请求的客户端、代理服务器等等)缓存。

  3. private
    申明响应只好被单个用户(只怕是操作系统用户、浏览器用户)缓存,是非共享的,不可能被代理服务器缓存。

  4. no-cache
    强制全体缓存了该响应的用户,在行使已缓存的数码前,发送带验证器的乞请到服务器。不是字面意思上的不缓存。

  5. no-store 禁止缓存,每一遍请求都要向服务重视新获取数据。

Expires

本篇主要介绍一下浏览器缓存:

商业事务缓存

缓存的能源到期了,并不意味财富内容发生了改造,假如和服务器上的财富无差别,实际上大可不必再度呼吁。客户端和劳务器端通过某种验证机制验证当前央求能源是或不是足以行使缓存。

浏览器第1回呼吁数据以往会将数据和响应底部的缓存标志存款和储蓄起来。再一次恳请时会带上存款和储蓄的头顶字段,服务器端验证是或不是可用。假若回到
30四 Not
Modified,代表能源未有发生退换能够运用缓存的多寡,获取新的逾期时间。反之再次回到200 就相当于再度请求了叁遍财富并替换旧财富。

Last-modified/If-Modified-Since

Last-modified:
服务器端财富的末段修改时间,响应底部会带上那个标志。第2次呼吁之后,浏览器记录这些日子,再度伸手时,请求尾部带上
If-Modified-Since 即为从前记录下的时光。服务器端收到带 If-Modified-Since
的央浼后会去和财富的最后修改时间比较。若修改过就回去最新能源,状态码
200,若未有退换过则赶回 30四。

美高梅开户网址 5

注意:倘诺响应头中有 Last-modified 而未有 Expire 或 Cache-Control
时,浏览器会有本人的算法来推算出3个时光缓存该文件多长时间,差异浏览器得出的流年不雷同,所以
Last-modified 要记得合营 Expires/Cache-Control 使用。

Etag/If-None-Match

由服务器端上变化的壹段 hash 字符串,第壹回呼吁时响应头带上 ETag:
abcd,之后的呼吁中带上 If-None-Match: abcd,服务器检查 ETag,再次回到 30肆 或
200。

美高梅开户网址 6

关于 last-modified 和 Etag 差异,已经有过三个人总括过了:

  • 一些服务器无法确切得到财富的最终修改时间,那样就无法透过最后修改时间推断能源是或不是更新。
  • Last-modified 只可以准确到秒。
  • 一些财富的最终修改时间更换了,可是内容没改动,使用 Last-modified
    看不出内容尚未改观。
  • Etag 的精度比 Last-modified
    高,属于强验证,需求财富字节级其他均等,优先级高。假如服务器端有提供
    ETag 的话,必须先对 ETag 进行 Conditional Request。

注意:实际应用 ETag/Last-modified
要小心保持一致性,做负载均衡和反向代理的话大概会并发不平等的事态。计算ETag 也是内需占用财富的,假设改造不是过分频仍,看自个儿的须求用
Cache-Control 是或不是能够满意。

选择 Cache-Control 的策略(摘自 Google Developers)

美高梅开户网址 7

Expires
指缓存过期的时刻,当先了那么些时间点就象征财富过期。有2个主题素材是出于应用具体时刻,借使时间表示出错只怕尚未改动成科学的时区都或者导致缓存生命周期出错。并且
Expires 是 HTTP/一.0 的职业,今后更倾向于用 HTTP/1.一 中定义的
Cache-Control。多个同时设有时也是 Cache-Control 的先期级越来越高。

  • HTTP Rresponse Header
  • Cache-Control
  • Expires
  • Last-modified
  • ETag
  • 实时更新缓存
  • 缓存攻略

骨子里行使

归来实际应用上来,首先要鲜明哪些内容符合被缓存哪些不切合。

考虑缓存的始末:

  • css样式文件
  • js文件
  • logo、图标
  • html文件
  • 能够下载的始末

部分不应有被缓存的内容:

  • 事务敏感的 GET 请求

可缓存的剧情又分为三种分裂的情形:

有难点改换的文本:

给 max-age 设置贰个一点都不小的值,一般设置 max-age=3153五千

譬如说引进的壹对第二方文件、打包出来的盈盈 hash 后缀 css、js
文件。一般的话文件内容改变了,会更新版本号、hash
值,相当于请求另2个文本。

正规中分明 max-age 的值最大不超过一年,所以设成
max-age=3153五千。至于过期内容,缓存区会将一段时间未有动用的文本删除掉。

有看齐用对话的款式来叙述那一个进程,便效仿着策动更清楚地解释:

美高梅开户网址 8美高梅开户网址 9

只怕时时必要改造的文书:

Cache-Control: no-cache / max-age=0

比如入口 index.html 文件、文件内容更改但名称不改变的能源。选拔 ETag 或
Last-Modified
来做表达,在选用缓存能源从前一定会去服务器端做验证,命中缓存时会比第二种情景慢一丢丢,毕竟还要发请求实行通讯。

美高梅开户网址 10美高梅开户网址 11

注意: 这里只描述了最中央的思绪,实际应用 HTTP
缓存要求后端协作配置,具体情状具体相比,而且各方的完毕并不一定完全依据正规来的,踩踩坑更健康。

参照小说

https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=zh-cn\#publicprivate

https://jakearchibald.com/2016/caching-best-practices

https://zhuanlan.zhihu.com/p/28113197

https://www.digitalocean.com/community/tutorials/web-caching-basics-terminology-http-headers-and-caching-strategies

https://stackoverflow.com/questions/12908766/what-is-cache-control-private

http://www.alloyteam.com/2016/03/discussion-on-web-caching/\#prettyPhoto

4 赞 12 收藏 4
评论

美高梅开户网址

美高梅开户网址 12

Cache-Control

Cache-Control

Cache-Control用于定义财富的缓存计策。能够钦命no-storeno-cachepublicprivatemax-gaes-maxage

no-store纯属禁止缓存,每回请求能源都要从服务重视新获得。常见于含有隐秘数据或银行多少等场馆。

no-cache表示不管max-age过但是期,每一次都要向服务珍视新验证财富是或不是被更换。唯有服务器端确认财富未被退换后(如前面会介绍的Last-modified或ETag),才具利用当地缓存。

public(暗中认可正是public)允许代理服务器缓存能源,以供多用户间共享。

private不相同意代理服务器缓存该能源,用户间不共享,如HTTP认证响应会自动设为private

max-age缓存最大使得时间。单位是秒,从被呼吁时开端计时,那样能够幸免时钟同步难题。因为原先用于缓存的Expires需求服务器和客户端石英钟严厉同步,因而HTTP
一.一引进了cache-control:
max-age来幸免石英钟同步的界定。因而当cache-control:
max-age和Expires同时出现,Expires将被忽略。

s-maxage只适用于共享缓存如CDN缓存。

如图服务器端收到请求后,在HTTP Tiggoresponse Header里将cache-control:
max-age=120,表示该财富的可行时间为贰分钟。贰分钟内客户端如需重新行使该能源,可以一贯从本地读取,不供给再次向服务器发出请求了。

Cache-Control的判别流程图:

Cache-Control 能够由多少个字段组合而成,重要有以下多少个取值:

Expires

在HTTP①.一引进Cache-Control此前,用Expires设置缓存过期时间,告诉浏览器在逾期岁月前浏览器能够直接从本地读取能源,不必再次向服务器请求。

但HTTP一.一现在用Cache-Control代替了Expires,假若为了包容性cache-control:
max-age和Expires同时出现,Expires将被忽视

1.max-age点名三个岁月长度,在那么些小时段内缓存是行得通的,单位是s。在尚未禁止使用缓存并且未有超过有效时间的图景下,再一次走访那么些财富就命中了缓存,不会向服务器请求财富而是间接从浏览器缓存中取。

Last-modified

Last-modified是服务器告诉浏览器这几个财富最终被涂改的时日。

有何样用呢?比如浏览器依照cache-control:
max-age或Expires发掘缓存过期了,按理应该向服务珍视新请求能源。但假设能源内容其实并未有变,重新请求财富太浪费了,用Last-modified能够优化那么些进程。

在有Last-Modified的图景下,浏览器会发送If-Modified-Since恳请,服务器端比对请求里Last-modified时间和能源文件最后被修改时间是不是①致。要是同样,服务器端回复304 Not Modified,那样浏览器就能一而再行使本地的逾期缓存了,节约了带宽。如若不一致,服务器苏醒200 OK,重新发送财富给浏览器。

Last-modified作为壹种优化手腕,必要和cache-control:
max-age或Expires共同选择。

2.s-maxage同 max-age,覆盖
max-age、Expires,但仅适用于共享缓存,在个人缓存中被忽略。

ETag

Last-modified作为1种优化花招,还不够健全,有时会有一些标题:

  1. 一点服务器不能够确切得到能源的结尾修改时间
  2. 举例资源修改11分频仍,在秒以下的时光内举行改换,而Last-modified只可以准确到秒
  3. 1部分能源的尾声修改时间变了,但实际上内容没改造

从而引进了ETag作为Last-modified的进阶版来消除地方那个标题。服务端依照实体内容生成1段hash字符串,用以标志财富的景况。具体变化的hash字符串服务器有友好的正规化,如Apache中,暗中同意是对文件的索引节(INode),大小(Size)和末段修改时间(MTime)举行hash后获得的。举个例子Etag:
“54八三ec七b-7c5二”

ETag的法则和Last-modified类似,固然浏览器遵照cache-control:
max-age或Expires发掘缓存过期了,但假使财富其实未有变的话,重新请求有点浪费。用ETag能够优化那么些进程。

在有ETag的事态下,浏览器会发送If-None-Match恳请,服务器端将呼吁里ETag字符串和资源文件的ETag字符串实行比较。若是同样,服务器端回复304 Not Modified,那样浏览器就能持续使用本地的过期缓存了,节约了带宽。假如不雷同,服务器苏醒200 OK,重新发送能源给浏览器。

ETag作为Last-modified的进阶版,同样必要和cache-control:
max-age或Expires共同使用。而且当ETag和Last-modified同时存在时,Last-modified会被忽视,由此只要ETag相称失败,就算缓存的Last-Modified没失效,也获取不到30四Not Modified。

如下图,浏览器开采cache-control:
max-age=120过期了,就向服务器发送If-None-Match请求,服务器发掘能源未被涂改过,因而回复30四Not Modified公告浏览器继续使用本地缓存

ETag的难点在于选择网址服务器会接纳财富的有个别品质来布局它,但对此全部多台服务器的网址,如Apache和IIS使用的性情差别,导致变化的hash值不一致,会大大下跌验证的成功率。结果是,对于完全一样的财富,当浏览器从Apache上收获了能源,又向IIS发起Get请求,ETag是不会协作的。用户就不能接受越来越小更加快的304,而是收到200常规去下载该能源。

如在多台服务器上住宿你的网址,且你采纳暗许ETag配置的Apache或IIS,那么成效难点你必须面对。举例Apache用FileETag可从ETag中移除inode值,只留下大小和时间撮作为组件的ETag。IIS也有近似的ChangeNumber只留下时间撮作为组件的ETag。当然也得以深透移除ETag,如Apache上FileETag
none

完整缓存的进程:

3.public申明响应得以被其它对象(发送请求的客户端、代理服务器等等)缓存。

实时更新缓存

若是您转移了某财富,如CSS,但用户当地的cache-control:
max-age或Expires时间未到,用户如故会使用旧的CSS。除非缓存过期,或用户清理了浏览器缓存,不然你改改的财富文件是未曾主意第一时半刻间公告到用户的。

设若想要达成,只好修改能源文件路线,比如将CSS文件名重命名叫xxx-v二.css等。以此强制用户重新加载最新版财富。

4.private标记响应只好被单个用户(或者是操作系统用户、浏览器用户)缓存,是非共享的,无法被代理服务器缓存。

缓存计谋

可以为分歧类别的能源文件定制分化的缓存计策,如下图:

HTML文件必须保障新型,因而定义成no-cache,那样每一次请求都会注解该HTML文件是还是不是最新

JS和CSS文件因为日常会被涂改,因而文件名嵌入指纹码(也能够是版本号或时刻戳)。每回修改文件后文件名均不相同,相当于HTML里加载分歧的公文,强制用户下载最新版。由于文件名里嵌入了指纹码,能够放心大胆地将max-age设置1年。

JS里标识为private,因为JS里只怕会包括部分亲信数据。

图片因为不常变,所以文件名不必包蕴指纹码,能够依据须要设置max-age

最终同盟ETag能够使得缓存机制更迅捷。

5.no-cache强制全数缓存了该响应的用户,在利用已缓存的多少前,发送带验证器的请求到服务器。不是字面意思上的不缓存。

6.no-store禁止缓存,每一趟请求都要向服务注重新获取数据。

情商缓存

缓存的财富到期了,并不意味着财富内容发生了改观,假诺和服务器上的能源未有异样,实际上完全没有供给再度恳请。客户端和服务器端通过某种验证机制验证当前呼吁财富是或不是足以选择缓存。

浏览器首回呼吁数据未来会将数据和响应尾部的缓存标志存款和储蓄起来。再一次请求时会带上存款和储蓄的头顶字段,服务器端验证是或不是可用。假如回到
30四 Not
Modified,代表财富未有发出变动能够动用缓存的多寡,获取新的超时时间。反之重回200 就也正是再一次请求了1回财富并替换旧财富。

Last-modified/If-Modified-Since

Last-modified:
服务器端财富的末尾修改时间,响应头部会带上这些标记。第四回呼吁之后,浏览器记录那个日子,再度伸手时,请求头部带上
If-Modified-Since 即为以前记录下的日子。服务器端收到带 If-Modified-Since
的央浼后会去和能源的最后修改时间相比较。若修改过就赶回最新能源,状态码
200,若未有更改过则赶回 304。

注意:要是响应头中有 Last-modified 而从不 Expire 或 Cache-Control
时,浏览器会有和睦的算法来推算出多个时间缓存该公文多短时间,区别浏览器得出的光阴分化,所以
Last-modified 要记得协作 Expires/Cache-Control 使用。

Etag/If-None-Match

由服务器端上变化的一段 hash 字符串,第二遍呼吁时响应头带上 ETag:
abcd,之后的乞请中带上 If-None-Match: abcd,服务器检查 ETag,再次来到 304 或
200。

关于 last-modified 和 Etag 区别,已经有不胜枚进士总计过了:

有些服务器无法正确获得财富的最终修改时间,那样就不可能通过最终修改时间推断财富是或不是更新。

Last-modified 只可以正确到秒。

有的能源的最终修改时间转移了,但是内容没改变,使用 Last-modified
看不出内容并没有改换。

Etag 的精度比 Last-modified
高,属于强验证,需要能源字节级其他1致,优先级高。要是服务器端有提供
ETag 的话,必须先对 ETag 进行 Conditional Request。

注意:实际应用 ETag/Last-modified
要留心保持一致性,做负载均衡和反向代理的话恐怕会出现不均等的境况。总括ETag 也是索要占用能源的,假使改变不是过于频仍,看自个儿的要求用
Cache-Control 是不是能够满足。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图