首先要了解的是,网络浏览器和爬虫看不到您的 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,它定义了浏览器和爬虫应该做什么即使文档无效。
那么让我们来看看这将如何被解释:
- 我们start in the "initial" insertion mode
-
That insertion mode 没有与我们的
<meta> 标记匹配的规则,所以我们落入“任何其他”,它告诉我们进入“html 之前”插入模式并重试。
-
That insertion mode 也没有规则,告诉我们插入一个隐式的
<html> 并进入“before head”插入模式。
-
That insertion mode 仍然没有匹配规则,所以告诉我们插入一个隐式的
<head> 并进入“in head”插入模式。
-
That insertion mode 终于包含了一条“标签名称为'meta'的开始标签”的规则。这是我们期望元标记的地方,因此它会正常处理。
- 然后我们在仍处于“in head”插入模式时遇到“Hello world”文本,该文本落入“anything else”,关闭
<head>,并进入“after head”插入模式。
-
That insertion mode 也无法处理文本,因此添加了一个隐式
<body> 并尝试“in body”插入模式。
-
That insertion mode 终于知道如何处理文本并插入了。
- 解析器到达文件末尾和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
这会以不同的方式解析...
- “初始”插入模式表示转到“html 之前”插入模式
- "before html" 插入模式说插入
<html> 然后进入"before head" 插入模式
- “before head”插入模式说插入
<head>然后进入“in head”插入模式
- 这一次,“in head”插入模式没有匹配规则,所以关闭
<head>并进入“after head”插入模式
- “头后”插入模式插入
<body>并进入“正文”插入模式
- 最后,我们添加“Hello World”并移至
<meta> 标签。
- 此规则说“使用 'in head' 插入模式的规则处理令牌。”这些规则允许浏览器读出字符编码,否则只是说插入节点并继续。
- 最后,还是在“in body”插入模式下,遇到“Goodbye World”,并输出。
- 和以前一样,所有打开的标签都在文件末尾隐式关闭。
所以这种情况下的结果是这样的:
<html>
<head></head>
<body>
Hello World
<meta name="robots" content="noindex">
Goodbye World
</body>
</html>
所以,我们的<meta> 标签现在实际上被认为是在文档的body 内,而不是在head 内。 HTML 没有定义接下来发生的确切情况,因为它没有专门定义“机器人”元标记。最终的答案将是这取决于:取决于您定义的元数据以及提取元数据的人。如果爬虫假定您的元标记将位于头部,它根本不会注意到正文中的这个。
最重要的是,如果您只使用有效的 HTML,则无需担心任何这些!