元数据是否必须位于 php 页面的 <head> 中,或者您可以将它们写在上面吗?

Do metadata have to be in the <head> on php pages or can you just write them over it?

我可以像这样写元数据吗:

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

或者您是否必须将它包含在 <head> 中,因为 Google 在 their website 上指定了它?

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

?>

这里首先要了解的是,网络浏览器和抓取工具看不到您的 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 includes a standardised parsing process 定义了浏览器和爬虫应该做什么 即使文档无效

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

  1. 我们start in the "initial" insertion mode
  2. That insertion mode 没有与我们的 <meta> 标签匹配的规则,因此我们陷入“其他”,它告诉我们转到“html 之前”插入模式然后重试。
  3. That insertion mode 也没有规则,告诉我们插入一个隐含的 <html> 并进入“before head”插入模式。
  4. That insertion mode still 没有匹配规则,所以告诉我们插入一个隐含的 <head> 并进入“in head”插入模式。
  5. That insertion mode 最后包含了一个规则“A start tag whose tag name is 'meta'”。这是我们期望元标记的位置,因此它会正常处理。
  6. 然后我们在“in head”插入模式下遇到“Hello world”文本,它属于“anything else”,关闭 <head>,并进入“after head”插入模式.
  7. That insertion mode 也无法处理文本,因此添加隐式 <body> 并尝试“in body”插入模式。
  8. That insertion mode终于知道怎么处理文本插入了
  9. 解析器到达文件末尾并且stops parsing。这将隐式关闭所有打开的标签。

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

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

因为那是 meta 标签的预期位置,所以遵循当前规范的任何内容都应将其视为您将其正确放入 <head> 中。


你的第二个例子,忽略 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”插入模式表示插入 <html> 然后转到“before head”插入模式
  3. “头前”插入模式说插入 <head> 然后转到“头内”插入模式
  4. 这次“in head”插入模式没有匹配规则,所以关闭<head>并进入“after head”插入模式
  5. “头部后”插入模式插入一个 <body> 并进入“体内”插入模式
  6. 最后,我们添加“Hello World”并移动到 <meta> 标签。
  7. 这个规则说“使用 'in head' 插入模式的规则处理令牌。”这些规则允许浏览器读出字符编码,否则只是说插入节点并继续。
  8. 终于,还是在“in body”的插入模式下,我们遇到了“再见世界”,输出了。
  9. 和以前一样,所有打开的标签都在文件末尾隐式关闭。

所以本例的结果是这样的:

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

所以,我们的 <meta> 标签现在实际上被认为是在文档的 body 而不是 head 中。 HTML 没有明确定义接下来会发生什么,因为它没有具体定义“robots”元标记。最终答案将是它取决于:既取决于您定义的元数据,又取决于提取它的人。如果抓取工具假定您的元标记位于头部,它根本不会注意到正文中的这个标记。


底线是,如果您坚持使用有效 HTML,则无需担心这些!