SEO meta 生成
填标题描述与 OG 字段,生成 head 片段并逐项检查长度与缺失,含分享卡占位预览。
这一页把左列六组输入拼成一段可粘进模板的 <head> 片段。OG 与 Twitter 的开关、「结构化数据」下拉只作用于自己那一组:关掉或选「不生成」时,那 N 项输入框整段不在页面上,输出里也不写 og:*。字段之间有回退链:og:title、og:description、og:url 与 Twitter 卡的 title/description/image 各自向上一层回退,每行取的是哪一层写在右栏预览的行末标注里。检查是真跑的:标题与描述各按码点数与量出来的像素宽两套阈值判,canonical、og:url、og:image 与每条 hreflang 的 URL 都要过 new URL,lang 与 hreflang 的语言码统一按 BCP 47 检查。
有一批字段只做转义输出、不做校验,用之前要自己核对:theme-color 的两个值、preconnect 与 dns-prefetch 的 origin、manifest 与图标的路径、format-detection 的键名、max-snippet 与 max-video-preview 的数值、twitter:site/creator 的账号写法、og:locale 与 og:image:locale 的语言码。og:image 的尺寸完全来自你手填的两个数字:本站不抓取任何远端 URL、量不到图片真实像素,所以比例判定与 600×313、3000×3000 这两个口径都是拿你填的数在算,页面注明后者是历史文档值、以各平台调试器为准。JSON-LD 只把你填的值写进去,缺失字段用兜底文案,绝不编造评分或日期,上线前仍需官方富结果测试复核。那个量出来的像素宽只是近似、不是保证;代码里没有 fetch/XHR/sendBeacon,也没有远程字体或图片。
SEO meta 生成怎么用
- 六组折叠,开关长在标题行上:左列是六个原生折叠组:基本(lang/charset/title/description/canonical/viewport/referrer,7 项)、robots 与索引控制(5 项加 13 枚指令 chip,带值的 max-snippet / max-image-preview / max-video-preview / unavailable_after 单独填,X-Robots-Tag 只作为注释镜像)、链接·颜色·图标(8 项)、Open Graph(11 项)、Twitter/X Card(15 项)、JSON-LD 字段(13 项)。只有「基本」默认展开,每组标题行右侧写着「N 项 · 展开中」或「N 项 · 已收起」。OG 与 Twitter 的开关、「结构化数据」下拉就在对应组的标题行上:关掉或选「不生成」,那一组的输入框整段从页面上消失(组体换成一句写明「N 项不在页面上、输出里也不写 og:*」的说明),再打开时按当前表单状态把框建回来并自动展开,值全程留在本页内存里。所以收起一组只是让它不显示,它不影响其它组的输出;「已收起」的组里的值照样进片段,只有「已关」的组才真的不写。工具条上另有两颗与分组无关的输出开关:分节注释(默认开)与「只要 head 内部」(默认关,关掉它才额外带上 <!DOCTYPE html> 和带 lang 属性的 <html>)。
- 右列三格先看读数:从上到下是 分享卡预览 → 生成的 <head> → 实时检查。预览那格标题右侧写着「OG 开 · Twitter 开(你选的卡型) · 图位 … · 占位预览,未发任何请求」,图位是按你手填的 og:image:width/height 摆的占位块,没填齐就按 1.91 : 1;卡片里每行文本后面挂着来源标注,写明这行取的是 og:title 还是回退到了 title。<head> 那格标着「N 字符 · N 字节 · N 行」;检查那格标着「N 项必修 · N 项建议 · N 项提示」,顶部横幅只汇总必须改的项,hreflang 互惠待核对清单跟在检查表下面。「基本」组的标题行上还常驻一行 title 与 description 的码点数、以及量出来的像素宽,边改边看是否被截——不用展开任何别的东西就能拿到这三个数。分享卡预览的图位是一块本地画的占位色块(没有 <img> 元素、不发任何请求),你填的 og:image 只作为一段文本原样列出那个 URL 而不加载它。图片比例判定是 1.91:1 与方形各一条信息,2% 容差之内算命中,两者都不是则警告「分享出去大概率被裁」。
- 取用输出:整段片段是可选中的纯文本,本页没有复制按钮,可用「下载 .txt」拿一份 head.html 风格的文本文件(下载用的 object URL 延后释放,避免同步回收把下载静默取消)。「记录这一版(用于查重)」把当前标题与描述存进内存,之后与它完全相同的 title/description 会在检查表里被报成重复项——只在本页这一会话里有效,刷新就清。粘贴时留意两件事:lang 与 X-Robots-Tag 在你选「只要 head 内部」时是以注释形式出现的,需要按前面的说明手工落到 <html> 标签与服务器响应头上——lang 在 head 序列里只以注释出现,提醒它必须写在 html 标签上;X-Robots-Tag 同理只写成注释,它属于 HTTP 响应头,要你自己同步到服务器或 CDN 配置。「恢复默认」把 59 个字段值连 robots 的 13 枚指令 chip 与结构化数据下拉一起写回出厂状态,它不动工具条上那两颗输出开关,也不清空查重记录,而且因为已经渲染的控件不会被重建,这一步是把值显式推回输入框并同步 og/tw 两颗开关的状态字。
- 输出里到底有哪些标签:输出的标签只有这些:charset(永远第一个,取你写的值并转小写,空则 utf-8)、viewport(始终输出)、两条 theme-color(分别带 media="(prefers-color-scheme: light|dark)",值为空的那条不输出)、title(始终输出)、description、robots、referrer(第一档「(不写)」就是整条不输出)、canonical、一行一条的 hreflang alternate、preconnect 与 dns-prefetch(按空格/逗号拆多个)、manifest、图标行(每行「路径 [尺寸]」出一条 icon 链接,行内含 apple 字样时另出 apple-touch-icon)、format-detection(只接受形如 xxx=on/off/yes/no 的片段,Apple 文档用的 telephone=no 也在内,不匹配的静默不输出)。JSON-LD 给 Organization / WebApplication / BreadcrumbList 三种最小骨架,或选「不生成」。
- 检查分几类、每类查什么:长度类:标题按码点数(Array.from 计数,emoji 算一个)判 70/10 两个阈值,描述按 160/50 判。URL 类:非 http(s) 协议、主机名里没有点(本地/内网地址)、写成相对路径都会点名;canonical 末尾既没斜杠也没扩展名时另给一条提示,提醒它与真实 301 目标不一致会被当成两个 URL。语言标签类:下划线写法(zh_CN→zh-CN)、主语言码不是 2–3 个字母、子标签既不是 2 位地区码/4 位文字码/3 位数字码、UK 应为 GB(ISO 3166-1 里英国是 GB)、zh 前缀却没带 Hans/Hant 文字子标签(这条只算信息级)——BCP 47 那套检查只用在 html lang 与 hreflang 上,OG 侧的下划线写法是文档惯例,这里不混用。robots 类只在真的给出矛盾值时报:同一份 robots 里 index/noindex、follow/nofollow、all/none 同时出现按更严格的算并把另一条判为噪音,meta 与 X-Robots-Tag 镜像值不一致时报两条通道不统一(文档通常说响应头优先,但没有跨引擎保证,所以只建议留一处),none 或 all 又叠了别的指令给信息级提示,max-image-preview 只认 none/standard/large 三个值,unavailable_after 要写成日期时间,认不出的指令一律报错并说明「没在 HTML/主流引擎文档里见过,不替你编」。referrer 的第一档「(不写)」给一条信息级说明:浏览器退回默认的 no-referrer-when-downgrade;其余取值必须落在规范那八个之内,写进别的字符串会被点名报错。charset 位置按规范单独算一次:把 `<!DOCTYPE html>`、<html lang>、<head>、charset 拼起来量 UTF-8 字节数,落在 1024 字节内才算满足 prescan 要求,超出就让你挪到最前面。不做校验的那几项:theme-color 的两个值任意 CSS 颜色都写得进来、页面不判合法性,preconnect 与 dns-prefetch 的 origin 不跑绝对 URL 校验,max-snippet 与 max-video-preview 的数值没有枚举检查(只有 max-image-preview 有)。
常见问题
标题 60 个字看着正好,为什么在搜索结果里被截?
因为 SERP 的截断是按渲染宽度决定的,不是按字数。本页把两套数都给出来:码点数(>70 才警告)只反映「这条标题有多长」,而真正的判据是那个隐藏元素量出来的像素宽——拉丁字母与汉字的宽度差好几倍,同样 60 个码点,英文标题可能已经超出上限、中文标题可能还绰绰有余。超出默认 600px 上限时会直接算出前多少个码点仍然放得下,建议把关键信息留在这个范围内。注意这个像素值依赖 DPI、字体栈(按 20px Arial 一类近似)与浏览器渲染设置,是个近似参考而不是保证;把重要词往前放,比把长度压到某个数字更可靠。
viewport 里写 user-scalable=no 为什么被标成必须改?
它禁止双指捏合缩放,直接违反 WCAG 1.4.4(放大,AA 级要求至少 2 倍缩放能力),需要放大才能阅读的人被这七个字符挡在外面。更麻烦的是它连「挡住」都做不到:iOS 的 Safari 从 iOS 10 起就默认无视这个限制,所以你实际限制到的只是其它引擎,无障碍失败却人人承担。同类问题还有 maximum-scale——它同样限制缩放,本页按数值分档:不足 2 直接报必须改,达到 2 也只给建议改;真要设上限,别低于 WCAG 作为更好实践推荐的 5 倍。常规写法就是检查项默认给的那一条:width=device-width, initial-scale=1。viewport 类的 user-scalable=no 直接报错、maximum-scale 按数值分档、缺 width= 或缺 initial-scale= 各给一条警告。
hreflang 只写在一页上为什么不够?
因为它要求互惠:你列出的每个 URL,对应那一页自己也必须回指这组里的全部语言(包含它自己),并且组内每页都要有指向自身 canonical 的那一条——缺了自指,整组标记都可能在报表里被忽略。本页能做的是格式与一致性检查(重复语言码、x-default 缺失或多条、语言码写法、URL 是否绝对),对面页面到底写没写它得联网才知道,而本站不发请求,所以它退而给你一份待核对清单:按你填的行假设同属一组,逐页列出那一页应当粘过去的全部 <link rel="alternate" hreflang> 标签。hreflang 类逐行查缺 URL、语言码格式、同一语言码重复、x-default 多于一条或缺失、组内没有一条指向当前 canonical(每页都得包含自己这条,否则整组容易被忽略),并把互惠作为信息项列出、按你填的行生成待核对清单。
这个页面会把我的 URL 和还没上线的文案发出去吗?
不会。安全性上这个页面有两层:所有输入写进 <textarea>/<input> 或经属性转义后才进片段,输出块用 textContent 呈现,不会被当 HTML 解析;同时代码里没有 fetch/XHR/sendBeacon,也没有远程字体或图片——meta 生成器这类工具常被贴进整站的 URL 结构和还没上线的文案,这里的内容不会离开浏览器。「按本站现状填一份」读的是当前这份文档自己的 head(title、description、canonical、若干 og:* 与 html lang),属本地读取,同样不是网络请求。
OG 与 Twitter 的字段是全都在,还是按条件输出?
OG 开关打开时 og:type、og:site_name、og:locale、og:title 四条总会出现,前三条留空也照样写成一个空 content,og:title 留空时取 title;og:description 与 og:url 分别在留空时回退到 description 与 canonical,description 也空时 og:description 整条不输出;填了 og:image 才追加 og:image:width、og:image:height、og:image:alt,宽高必须是大于 0 的数才输出,另有一栏按空格拆开后逐条输出 og:image:locale。Twitter 卡是 card 始终、site/creator 按需、title/description/image 按 twitter→og→基本字段逐级回退并另加 image:alt;卡型选 player 才输出 player 与宽高、stream,选 app 才输出 country 与 iphone/ipad/googleplay 三个 ID。检查侧对应的是:ogp.me 列为必备的 og:title、og:type、og:image、og:url 缺任何一项直接报错;og:type 是 article 或 profile 时给该命名空间的建议字段,只按建议处理,因为本站不联网、无法替你确认必填;有 og:image 而无 og:image:alt 记一条警告;Twitter 侧查卡型是否有图、player 卡齐不齐播放器 URL 与整数宽高、app 卡有没有至少一个商店 ID。
对应功能编号 #93无需安装,手机端同样可用按 Ctrl + K 换工具