【问题标题】:Do metadata have to be in the <head> on php pages or can you just write them over it?元数据是否必须在 php 页面的 <head> 中,或者您可以将它们写在上面吗?
【发布时间】:2021-04-26 20:04:52
【问题描述】:

我可以这样写元数据吗:

<meta name="robots" content="noindex">
    <?php
    
    echo "Hello World";

或者您是否必须将其包含在 &lt;head&gt; 中,因为 Google 在 their website 上指定了这一点?

<html><head>
<meta name="robots" content="noindex" />
</head>
</html>
 <?php
        
 echo "Hello World";

?>

【问题讨论】:

  • 我认为你可以通过这两种方式做到这一点,因为第一个也出现在标题中。
  • 它在第一个示例中的位置是什么?体内?完全在 HTML 之外?
  • @El_Vanja 不,它直接在页面上
  • 再次阅读链接问题的答案。不管它指的是身体,它通常解释了为什么这是一个坏主意。

标签: php html metadata


【解决方案1】:

首先要了解的是,网络浏览器和爬虫看不到您的 PHP 代码。 PHP 只是您碰巧用来生成 HTML 的工具。因此,如果您在记事本中创建了该 HTML,那么您的问题的答案将是相同的。

所以这个PHP:

<meta name="robots" content="noindex">
    <?php
    
    echo "Hello World";

只生成这个 HTML:

<meta name="robots" content="noindex">
    Hello World

接下来要了解的是,这是无效的 HTML。没有任何版本的 HTML 规范允许 HTML 文档看起来像那样。但是,WHATWG HTML Living Standard 包括 a standardised parsing process,它定义了浏览器和爬虫应该做什么即使文档无效

那么让我们来看看这将如何被解释:

  1. 我们start in the "initial" insertion mode
  2. That insertion mode 没有与我们的 &lt;meta&gt; 标记匹配的规则,所以我们落入“任何其他”,它告诉我们进入“html 之前”插入模式并重试。
  3. That insertion mode 也没有规则,告诉我们插入一个隐式的&lt;html&gt; 并进入“before head”插入模式。
  4. That insertion mode 仍然没有匹配规则,所以告诉我们插入一个隐式的&lt;head&gt; 并进入“in head”插入模式。
  5. That insertion mode 终于包含了一条“标签名称为'meta'的开始标签”的规则。这是我们期望元标记的地方,因此它会正常处理。
  6. 然后我们在仍处于“in head”插入模式时遇到“Hello world”文本,该文本落入“anything else”,关闭&lt;head&gt;,并进入“after head”插入模式。
  7. That insertion mode 也无法处理文本,因此添加了一个隐式 &lt;body&gt; 并尝试“in body”插入模式。
  8. That insertion mode 终于知道如何处理文本并插入了。
  9. 解析器到达文件末尾和stops parsing。这会隐式关闭所有打开的标签。

所以结果将等同于如果 HTML 看起来像这样(添加一些空格以提高可读性):

<html>
<head>
<meta name="robots" content="noindex">
</head>
<body>
    Hello World
</body>
</html>

由于这是 meta 标记的预期位置,因此遵循当前规范的任何内容都应该像正确地将其放入 &lt;head&gt; 一样对待它。


你的第二个例子,忽略 PHP,是这个 HTML:

<html><head>
<meta name="robots" content="noindex" />
</head>
</html>
 Hello World

请注意,这无效:文本内容在 HTML 之外。这会将解析器置于the "after after body" insertion mode(不,真的!),在这种情况下,最终假设文本在正文中,所以没有区别。


不过,我们可以看看不同的场景,在元标记之前有文本

Hello World
<meta name="robots" content="noindex">
Goodbye World

这会以不同的方式解析...

  1. “初始”插入模式表示转到“html 之前”插入模式
  2. "before html" 插入模式说插入&lt;html&gt; 然后进入"before head" 插入模式
  3. “before head”插入模式说插入&lt;head&gt;然后进入“in head”插入模式
  4. 这一次,“in head”插入模式没有匹配规则,所以关闭&lt;head&gt;并进入“after head”插入模式
  5. “头后”插入模式插入&lt;body&gt;并进入“正文”插入模式
  6. 最后,我们添加“Hello World”并移至&lt;meta&gt; 标签。
  7. 此规则说“使用 'in head' 插入模式的规则处理令牌。”这些规则允许浏览器读出字符编码,否则只是说插入节点并继续。
  8. 最后,还是在“in body”插入模式下,遇到“Goodbye World”,并输出。
  9. 和以前一样,所有打开的标签都在文件末尾隐式关闭。

所以这种情况下的结果是这样的:

<html>
<head></head>
<body>
Hello World
<meta name="robots" content="noindex">
Goodbye World
</body>
</html>

所以,我们的&lt;meta&gt; 标签现在实际上被认为是在文档的body 内,而不是在head 内。 HTML 没有定义接下来发生的确切情况,因为它没有专门定义“机器人”元标记。最终的答案将是这取决于:取决于您定义的元数据以及提取元数据的人。如果爬虫假定您的元标记将位于头部,它根本不会注意到正文中的这个。


最重要的是,如果您只使用有效的 HTML,则无需担心任何这些!

【讨论】:

  • 当它们有itemprop 属性时,你可以在body 标签中使用meta。 schema.org 也建议这样做
  • "任何阅读它的东西都会假设你实际上是指这个 HTML"——它不会。 HTML 解析规则会将&lt;meta&gt; 元素放在头部,然后在它碰到文本节点时创建body 元素。
  • html.spec.whatwg.org/multipage/parsing.html#parsing-main-inhead - 最后一位覆盖了头部内的文本节点
  • @Quentin 我已经编辑了问题以逐步了解 WHATWG 标准中的解析规则,这确认您是对的。 :)
  • @Quentin 更多的是出于我自己的好奇心,我现在也逐步完成了“元标记之前的内容”案例。
猜你喜欢
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多