尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Meta标签全攻略:从字符编码到社交分享的实用指南

Meta标签全攻略:从字符编码到社交分享的实用指南 做前端这些年我有个习惯拿到任何一个页面的源代码第一件事就是扒开head区看meta标签。这玩意儿在HTML里就几行字看起来毫不起眼但坑起人来一点不含糊。字符编码没配好整个页面直接变口口口乱码移动端没写viewport手机上字小到要用放大镜分享到微信、QQ的链接光秃秃一条没有缩略图逼格瞬间掉一半。可以说meta标签是那种配好了没人夸、配错了全是事的隐形关键角色。这篇文章我打算把meta标签从头到尾捋一遍不光是列标签、抄属性而是把每个标签背后的浏览器行为逻辑、SEO影响、实际使用场景和踩坑经验讲透。适合刚入行的前端新手把基础打牢也适合做SEO、做移动端H5、做社交分享优化的同学来查漏补缺。放心这篇不整虚的全是能直接抄走用的东西。1. meta标签到底在干什么先搞懂它的工作逻辑1.1 它不是数据本身而是关于数据的数据很多新手学meta标签上来就背meta charsetUTF-8、meta nameviewport背完就完事但换了个场景就不知道怎么用了。问题出在没理解meta的本质。meta是metadata的缩写翻译过来是元数据。什么意思呢它不是页面里用户看到的内容而是关于这个页面的说明信息也就是数据的数据。就像一本书的扉页版权信息书名、作者、出版社、ISBN号这些不构成书的故事内容但发行方、图书馆、读者能靠这些信息管理这本书。meta标签扮演的就是这个角色服务对象不是读者用户而是浏览器、搜索引擎、社交平台、各种爬虫程序。因为这个定位meta标签必须放在head区域里而且大多数meta标签不会被渲染到页面上。它通过名值对的方式告诉外部程序我这个页面用什么编码我这个页面的简介是什么我允不允许被搜索收录我分享出去的卡片长什么样。1.2 两种工作方式name和http-equivmeta标签的传参方式分两种理解这个就理解了所有meta的变体。第一种是name配合content这是绝大多数情况下的用法。name表示这条元数据的属性名content就是属性值。比如meta namedescription content这是一篇meta标签教程意思是本页面的描述是……主要是给搜索引擎、社交平台这些读者看的。第二种是http-equiv配合content。http-equiv全称是HTTP equivalent意思是HTTP响应头的等价物。它做的事情是模拟HTTP响应头让浏览器在拿到HTML文档时按照指定的方式处理。最经典的就是meta http-equivrefresh content5; urlhttps://example.com相当于服务器告诉浏览器5秒后跳转到别的地址。http-equiv听起来挺酷但实际使用要非常克制因为这等于绕过了服务器配置直接在文档层面控制浏览器行为。能通过服务器响应头实现的尽量别靠meta原因我在后面的章节专门讲。1.3 浏览器的解析顺序为什么charset必须放最前面我见过不少页面乱码最后定位到原因居然是charset写在了其他meta后面。这里牵涉一个关键规则浏览器的HTML解析器读取文档时需要在最前面的1024字节内确定字符编码否则就要一边猜一边解析。HTML5规范明确建议meta charset应该放在head的第一个子节点不但是第一行而且前面不能有超过1024字节的内容。因为浏览器是流式解析的边下载边解析只有尽早拿到编码信息才能用正确的解码方式去解析后面的字节流。要是编码声明放在后面前面那些中文内容已经被用错误的编码解析了一遍哪怕后面看到了charset也来不及了这就是乱码的根源。所以写HTML骨架第一行!DOCTYPE html第二行就必须是meta charsetUTF-8这是铁律。2. 字符集和视口两个不配好就翻车的基础meta2.1 charsetUTF-8一统天下的时代meta charsetUTF-8是现在唯一推荐的字符集声明其他的像GBK、GB2312、ISO-8859-1这些除非你在维护一个十几年前的老项目否则真没必要碰。UTF-8是可变长度编码兼容ASCII又能表示几乎所有人类语言字符是Web事实上的标准。你可能会问既然服务器可以在HTTP响应头里通过Content-Type字段声明编码为什么还必须在HTML里写一遍因为有时候服务器配置会出错、或者HTML文件被本地打开、或者经过某些代理转发时响应头丢失HTML里的meta声明就是最后一道保险。还有个细节很多人不知道HTML5规范里这是唯一一个不需要name也不完全依赖http-equiv的meta它是charset属性的简化形式。老写法是meta http-equivContent-Type contenttext/html; charsetUTF-8现在直接写charset就完事省心。2.2 viewport移动端页面的生死线meta nameviewport contentwidthdevice-width, initial-scale1.0这句话值得每个做Web的人刻在脑子里。为什么这个meta这么重要因为在智能手机普及初期那些没有viewport声明的页面在手机上打开时移动浏览器会用大约980px的虚拟宽度来渲染整个页面然后整体缩小适配屏幕。结果就是字小得根本看不清用户必须双指放大才能阅读。用户体验可以说是一塌糊涂。viewport meta的作用就是告诉移动浏览器你别自作主张用980px了按设备的实际宽度来布局初始缩放比例设为1.0。widthdevice-width就是让布局视口宽度等于设备屏幕宽度initial-scale1.0就是初始缩放级别不放大不缩小。这里要提醒一个优化点content里还有两个属性maximum-scale和user-scalableno我是极其不推荐加的。user-scalableno直接禁用了用户双指缩放这不仅是可用性问题还踩了WCAG无障碍标准的红线——用户有视力障碍需要放大页面你直接给关了。我实测过iOS Safari在iOS 10之后干脆直接忽略了这个属性安卓部分浏览器也会忽略。所以老老实实只写width和initial-scale就够了。3. SEO老四样与新规范让搜索引擎正确理解页面3.1 description搜索摘要的来源也是点击率的隐形推手meta namedescription content页面描述内容是SEO里最值得精心编写的meta没有之一。因为当搜索引擎把你这个页面排在搜索结果里时通常会用这个description作为摘要展示在标题链接下方的那一两行灰色小字。用户看到你的链接点不点很大程度上取决于这段描述写得吸不吸引人。描述的字数要控制住。Google显示摘要大概在150到160个字符左右超出部分会被截断成省略号虽然截断不是致命的但会在视觉上显得很糙。百度的情况也类似约100个中文字。所以写description的正确姿势是核心关键词前置把卖点和价值在开头就讲清楚不要写空话套话更不要堆砌关键词列表——搜索引擎对关键词堆砌的识别非常成熟堆多了反而可能被判定为垃圾内容。另外记住一个关键点description是给用户看的其次才是给搜索引擎看的。从转化角度来看这段文字就是你的广告文案是搜索结果页上的广告位写得好点击率明显不一样。我自己的习惯是给每个重要页面单独手写description而不是全站用同一套模板哪怕是动态页面也会根据页面标题拼接一段有差异的描述。3.2 keywords和robots老标签的边缘化与正确用法先说keywords。meta namekeywords content关键词1,关键词2这个是远古时代搜索引擎的重要参考但Google早在2009年就官方宣布不把keywords meta用于网页排名了。原因很简单这个标签被SEO从业者玩坏了变成纯粹的关键词堆砌场所彻底失去信息价值。百度和Bing虽然还保留一定参考但权重也很低甚至可能因为堆砌产生负面影响。我的建议是keywords现在写不写都行如果写保持诚实、保持精确3到5个词就好不要做任何形式的堆砌。它是给那些仍在读取这个字段的搜索程序一个底线正确的信号而不是你的优化杠杆。robots这个meta就重要多了。meta namerobots contentindex, follow意思是允许收录、允许跟踪链接这是最常用的取值。其他组合包括noindex不要收录本页、nofollow不要跟踪本页链接、noarchive不要保存快照、nosnippet不要在搜索结果中显示摘要等。这标签主要用在那些不想被搜索引擎收录的页面——后台管理页、登录页、重复内容页、或者上线前的测试页。3.3 canonical不是meta但你必须和它一起用严格来说link relcanonical hrefhttps://example.com/page不是meta标签但讲SEO就绕不开它。它的作用是声明当前页面的标准地址。比如同一篇商品详情可以通过?sortprice和?sorttime两个URL访问内容高度相似搜索引擎会困惑该收录哪个。canonical就是在告诉搜索引擎这两个URL只是同一个页面的变体真正的正版是这个标准地址权重请记在它头上。我处理过多语言站和参数站的SEO问题canonical基本上是不可或缺的。要注意的是canonical里的href必须写绝对地址不能写相对路径/page必须https://example.com/page这整串。另外canonical指向的URL如果返回404这个声明就废了。4. 社交分享卡片Open Graph和Twitter Card的实战配置4.1 为什么要花心思配OG标签你有没有见过这种场景在微信里发一个链接出去聊天窗口显示一个带大图、带标题、带描述的卡片高级感扑面而来。而有些链接发出去就是光秃秃一条URL灰头土脸没人想点。差别就在OG标签上。OG是Open Graph的缩写是Facebook推出的协议现在被微信、QQ、微博、LinkedIn等几乎所有主流社交平台采用。它通过一系列meta propertyog:xxx contentxxx标签告诉社交平台的爬虫分享我这个链接时请用这个标题、这段描述、这张图来生成卡片。说白了你给平台一个预演配置平台照着渲染。在实际项目中我发现很多团队做完了页面完全没想过社交分享的体验。直到产品经理把链接发到群里出来一条干巴巴的URL才意识到这个问题。与其到时候手忙脚乱补不如开发阶段就把OG标签作为每个页面的标准配置。4.2 一套能直接抄的OG模板下面是我常用的基础OG配置适用于绝大多数内容型页面meta propertyog:type contentarticle / meta propertyog:title contentmeta标签的详细讲解原理、SEO、移动端与社交分享全指南 / meta propertyog:description content从浏览器解析原理到SEO优化、移动端适配、社交分享卡片配置一文讲透meta标签的实战用法与常见坑。 / meta propertyog:url contenthttps://example.com/posts/meta-tag-guide / meta propertyog:image contenthttps://example.com/images/meta-tag-cover.jpg / meta propertyog:site_name content我的技术博客 / meta propertyog:locale contentzh_CN /逐个说一下关键点。og:title和og:description的长度控制比SEO的description稍微灵活一些但建议仍然控制在一两行内太长会被截断。og:url必须是当前页面绝对地址最好和canonical的值保持一致避免权重分散。og:type取值影响卡片的形态文章页用article网站首页用website商品页可以用product。og:image是重头戏它决定卡片的视觉吸引力。图片链接必须是绝对地址因为社交平台的爬虫不在内网它可不知道/images/cover.jpg相对路径指向哪里。图片比例也要注意。多数平台对1.91:1比例的横图支持最稳定太扁的图会被裁切太方的图在某些平台又会显示不全。我在项目中一般直接用600×315或1200×630的图。4.3 Twitter Card虽然小众但配置起来很便宜Twitter Card是Twitter自己的分享卡片协议和OG标签类似但是用twitter:前缀。最常用的是这两种meta nametwitter:card contentsummary_large_image / meta nametwitter:title contentmeta标签的详细讲解原理、SEO、移动端与社交分享全指南 / meta nametwitter:description content从浏览器解析原理到SEO优化、移动端适配、社交分享卡片配置一文讲透meta标签的实战用法与常见坑。 / meta nametwitter:image contenthttps://example.com/images/meta-tag-cover.jpg /summary_large_image表示卡片形态是大图标题描述适合分享文章summary则是小卡片。如果不想为Twitter单独写一套可以只写一个twitter:card再去让twitter:title直接复用og:title——Twitter官方也支持在缺少twitter:title时回退到og:title。这里有个容易踩的坑Twitter Card要求图片的URL必须可以被Twitter的抓取器直接访问而且图片体积不能太大。我遇到过图片地址没问题但死活出不了卡片的情况最后发现是图片文件太大超过了Twitter的抓取限制。压缩一下就好。4.4 配好了不出卡片怎么办调试工具是必学项OG标签配好、页面部署上线然后在微信里一发发现还是没有卡片信息。这种情况太常见了。原因通常有三个一是平台缓存了旧版本页面二是平台爬虫抓取失败三是标签格式有错误。对微信你可以把链接发到任意聊天窗口然后预览看效果对Facebook和Twitter它们各自有官方的分享调试工具——Facebook的Sharing Debugger和Twitter的Card Validator输入URL就能看到爬虫视角的页面长什么样还能强制刷新缓存。在工作中调试分享卡片是家常便饭别自己瞎猜直接用调试工具看抓取结果是最快的定位方式。5. 移动端体验细节Apple与Android专属meta冷门项5.1 format-detection干掉那个自动拨号的下划线在iOS Safari和部分安卓浏览器里如果页面里出现过类似手机号固定电话的数字串浏览器会自动把它识别成电话号码加上蓝色下划线用户点击还会唤起拨号面板。有时候这不是你想要的——比如你在写一个订单号15812345678、快递单号、或者其他恰好长得像电话号码的数字结果在iPhone上被自动识别成电话链接体验很差。解决办法就是这条metameta nameformat-detection contenttelephoneno /加了这行之后iOS就不会自动识别页面中的数字为电话号码了。当然如果你的页面里真的有需要用户点击拨号的联系电话那就不加或者给那个号码单独包一层a hreftel:你的号码手动控制。我自己做H5页面时基本都是默认加上的毕竟自动识别出错的概率远大于用户主动拨号的需求。5.2 theme-color和Apple专属配置让页面和手机融为一体安卓Chrome从版本39开始支持theme-color标签它控制的是浏览器地址栏的颜色。比如你的品牌主色调是蓝色加上这句之后用户在安卓Chrome里打开你的站点地址栏会跟着变成蓝色视觉上整个浏览器和你的页面融为一体品牌感一下就起来了。meta nametheme-color content#007aff /后面还可以分主题模式适配比如深色模式用不同的颜色meta nametheme-color content#ffffff media(prefers-color-scheme: light) / meta nametheme-color content#1c1c1e media(prefers-color-scheme: dark) /Apple这边有几个apple-mobile-web-app-前缀的meta是给把网页添加到主屏幕、全屏运行这种场景用的meta nameapple-mobile-web-app-capable contentyes / meta nameapple-mobile-web-app-status-bar-style contentblack-translucent / meta nameapple-mobile-web-app-title content站点名称 /apple-mobile-web-app-capable含义是允许这个页面以全屏模式运行当用户通过添加到主屏幕打开时不显示Safari的地址栏和工具栏更像原生Appapple-mobile-web-app-status-bar-style控制的是iOS顶部状态栏的样式black-translucent是黑色半透明和页面背景更融合apple-mobile-web-app-title则是设置主屏幕上显示的图标名称。要提醒一下苹果对这几个meta的支持并没有官方文档说得那么稳定不同iOS版本表现有差异所以做PWA或者添加到主屏幕的场景时一定要拿真机反复测。另外添加主屏幕的图标是link relapple-touch-icon href图标地址注意这不是meta标签但它和上面几个标签经常一起出现所以放这里一并提了。图标尺寸建议180×180iOS会自动适配。6. http-equiv家族响应头替身的使用边界与时效性6.1 refresh跳转标签但早被SEO拉黑了meta http-equivrefresh content0; urlhttps://example.com的写法很直观0秒后跳转到后面的地址。你可能会想这不就是最方便的跳转方式吗什么服务器配置都不用改放个标签就完事。但这里有个残酷的现实Google官方早已把meta refresh列为不建议使用的跳转方式百度也同样不信任它。原因在于它太容易被滥用——恶意的跳转、干扰用户操作、黑帽SEO手法里经常出现它的身影。搜索爬虫处理meta refresh时权重传递比301跳转差很多有些情况下甚至不传递任何权重。我的建议非常明确需要做页面跳转时优先用服务器层级的301或302跳转其次是正常的页面里用JavaScript跳转meta refresh只适合极少数场景——比如你只能修改HTML、完全不能碰服务器配置的时候。而content的秒数如果不是0用户会先看到当前页面任停留几秒再跳走这个体验没几个人喜欢。能不用就不用。6.2 X-UA-Compatible曾经的神今天的陈年往事meta http-equivX-UA-Compatible contentIEedge这个标签凡是经历过IE时代的开发者都熟悉。它的作用是告诉IE浏览器用最高版本的渲染引擎来渲染当前页面避免IE用兼容模式渲染导致页面错乱。当年有个著名的槽点IE8时代如果不加这个标签IE可能用IE7标准模式渲染你的页面。很多团队为此在模板里机械地加上这一句甚至有人直接在母版页写死。但随着微软停止IE维护、Edge全面转向Chromium内核这个标签现在基本就是历史遗留物了。2022年6月之后已经不是建议不写而是写了其实也没什么影响因为根本没人用IE打开你的页面了。新项目里我个人是不写它的模板干净一点是一点。维护老项目的时候倒是可以留着万一还有用户用老版本IE浏览器呢。虽然这个概率低到可以忽略但加上也没什么成本就当买个心理安慰。6.3 CSP和Cache-Control重要但更推荐用响应头把Content-Security-Policy写在meta里是可行的meta http-equivContent-Security-Policy contentdefault-src self; img-src https://cdn.example.com /这条策略的效果是页面只能加载同源资源图片只允许从指定CDN加载其他来源的资源一律拦截。对前端安全来说CSP是很有力的防线能在一定程度上缓解XSS注入。但是我更推荐你在服务器响应头里配CSP而不是写在meta标签里。原因有几点一是meta方式无法在部分浏览器中完整支持二是CSP的头字段能被安全测试工具正确识别审计更方便三是服务器可以按不同URL下发不同策略更灵活四是防止HTML被注入时攻击者直接删掉head里的CSP meta——注意攻击者能注入HTML就能改你的meta。同样cache-control和expires这些控制缓存的标签理论上也能用http-equiv写但浏览器支持度参差不齐远不如在服务器响应头里配置可靠。所以说到底http-equiv的意义在于在无法修改服务器配置的情况下做一个客户端层面的补救它不是替代方案。7. 高频meta速查表与几则实测教训7.1 一页纸速查表用途完整写法备注字符编码meta charsetUTF-8必须放在head第一行移动端视口meta nameviewport contentwidthdevice-width, initial-scale1.0不要加user-scalableno页面描述meta namedescription content一句话介绍控制在150字符内搜索引擎抓取meta namerobots contentindex, follow后台页用noindex标准地址声明link relcanonical href绝对地址不是meta但常放在一起分享卡片标题meta propertyog:title content标题所有og属性同理分享大图meta propertyog:image content绝对地址建议1200x630禁用号码识别meta nameformat-detection contenttelephonenoiOS和Android主题色meta nametheme-color content#007aff安卓Chrome修改地址栏颜色iOS全屏meta nameapple-mobile-web-app-capable contentyes配合状态栏样式使用定时跳转meta http-equivrefresh content0; url地址SEO不推荐慎用7.2 教训一description不更新的缓存陷阱我有个客户站点改了首页的description之后在搜索引擎里看到的还是旧摘要一度怀疑缓存的问题还是标签没生效。折腾半天发现是两套模板系统线上页面用的是另一套模板我只改了一处。这个问题的教训是大型项目里meta标签往往被多个模板、多个系统重复渲染排查的时候先确认你看到的那份HTML里到底是不是你想改的那份配置在起作用。凡是涉及SEO信息的修改都应该在上线后用查看源代码去验证实际输出而不是相信代码仓库里改了就等于线上生效。这一步很多人会偷懒而恰恰是这一步能省下最多的排查时间。7.3 教训二OG描述的图片路径是相对地址还有个项目og:image写的是images/cover.jpg我在本机测试一切正常页面渲染也正常因为浏览器会基于当前URL解析相对路径。结果把链接发到微信里卡片怎么都不出图。原因就是社交平台的爬虫抓取页面时解析相对路径的基准URL和我预期的不同导致爬虫请求了一个404的图片地址。OG协议里要求所有URL必须是绝对地址这不是建议是必须。og:url、og:image还有Twitter Card里的twitter:image全部要写完整的https://协议地址。我自己后来做了一个小习惯凡是写OG标签一定在部署后用平台的调试工具抓一次看看出图情况确认无误再交给运营。7.4 教训三viewport设置不当导致的移动端误判有个H5活动页移动端打开后页面整体偏左右侧有一大片空白。查了很久发现是viewport写成了width750这是拿设计稿的像素宽度直接当了布局宽度。width750的意思是让布局视口宽度固定为750px不管用户是iPhone SE还是安卓全面屏都用750px宽度布局然后缩放到屏幕宽度。这样做的结果是页面在宽屏手机上OK但在窄屏手机上因为缩放比例不同会出现留白或者内容被裁切的问题。正确写法永远是widthdevice-width直接对齐设备的物理宽度。如果你的页面需要按750px设计稿做响应式那应该靠CSS的vw、rem这些单位来实现而不是去篡改viewport的宽度。viewport是移动端布局的基石改动它等于动地基凡是动地基的事情都要极其谨慎。7.5 教训四不要为了全把meta堆成山最后说一个审美层面的问题。我看过一些项目head区里堆了四五十行meta很多是从网上抄来的各种最全meta标签汇总里面一半都已经废弃或者没有实际作用比如meta nameauthor、meta namecopyright、meta http-equivcontent-language这些。这些标签不报错但也没有任何有效作用纯粹增加文档体积和后人阅读的负担。正确的meta配置思路是按需配置。基础三件套charset、viewport、description机器人声明robots社交分享og及twitter移动端特殊需求format-detection、theme-color等够用了。每多写一个meta就要多一分维护成本。代码不是越多越好而是越精准越好。这条原则放在meta标签上再合适不过。做了这么多年页面的感受是meta标签虽然不起眼但它连接着浏览器、搜索引擎、社交平台这三方重要的外部程序是不折不扣的接口层。你把这一层配置好了页面在各种环境里的表现都会顺畅不少配置不当用户不会指名道姓说是meta标签的锅但体验差是实实在在的。希望这篇梳理能帮你少走点弯路以后调页面、做分享、搞SEO的时候能少踩一个坑是一个坑。
返回列表