元数据是否必须位于 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 定义了浏览器和爬虫应该做什么 即使文档无效。
那么让我们来看看这将如何解释:
- 我们start in the "initial" insertion mode
- That insertion mode 没有与我们的
<meta>
标签匹配的规则,因此我们陷入“其他”,它告诉我们转到“html 之前”插入模式然后重试。
- That insertion mode 也没有规则,告诉我们插入一个隐含的
<html>
并进入“before head”插入模式。
- That insertion mode still 没有匹配规则,所以告诉我们插入一个隐含的
<head>
并进入“in head”插入模式。
- That insertion mode 最后包含了一个规则“A start tag whose tag name is '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”插入模式
- “头前”插入模式说插入
<head>
然后转到“头内”插入模式
- 这次“in head”插入模式没有匹配规则,所以关闭
<head>
并进入“after head”插入模式
- “头部后”插入模式插入一个
<body>
并进入“体内”插入模式
- 最后,我们添加“Hello World”并移动到
<meta>
标签。
- 这个规则说“使用 'in head' 插入模式的规则处理令牌。”这些规则允许浏览器读出字符编码,否则只是说插入节点并继续。
- 终于,还是在“in body”的插入模式下,我们遇到了“再见世界”,输出了。
- 和以前一样,所有打开的标签都在文件末尾隐式关闭。
所以本例的结果是这样的:
<html>
<head></head>
<body>
Hello World
<meta name="robots" content="noindex">
Goodbye World
</body>
</html>
所以,我们的 <meta>
标签现在实际上被认为是在文档的 body 而不是 head 中。 HTML 没有明确定义接下来会发生什么,因为它没有具体定义“robots”元标记。最终答案将是它取决于:既取决于您定义的元数据,又取决于提取它的人。如果抓取工具假定您的元标记位于头部,它根本不会注意到正文中的这个标记。
底线是,如果您坚持使用有效 HTML,则无需担心这些!
我可以像这样写元数据吗:
<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 定义了浏览器和爬虫应该做什么 即使文档无效。
那么让我们来看看这将如何解释:
- 我们start in the "initial" insertion mode
- That insertion mode 没有与我们的
<meta>
标签匹配的规则,因此我们陷入“其他”,它告诉我们转到“html 之前”插入模式然后重试。 - That insertion mode 也没有规则,告诉我们插入一个隐含的
<html>
并进入“before head”插入模式。 - That insertion mode still 没有匹配规则,所以告诉我们插入一个隐含的
<head>
并进入“in head”插入模式。 - That insertion mode 最后包含了一个规则“A start tag whose tag name is '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”插入模式 - “头前”插入模式说插入
<head>
然后转到“头内”插入模式 - 这次“in head”插入模式没有匹配规则,所以关闭
<head>
并进入“after head”插入模式 - “头部后”插入模式插入一个
<body>
并进入“体内”插入模式 - 最后,我们添加“Hello World”并移动到
<meta>
标签。 - 这个规则说“使用 'in head' 插入模式的规则处理令牌。”这些规则允许浏览器读出字符编码,否则只是说插入节点并继续。
- 终于,还是在“in body”的插入模式下,我们遇到了“再见世界”,输出了。
- 和以前一样,所有打开的标签都在文件末尾隐式关闭。
所以本例的结果是这样的:
<html>
<head></head>
<body>
Hello World
<meta name="robots" content="noindex">
Goodbye World
</body>
</html>
所以,我们的 <meta>
标签现在实际上被认为是在文档的 body 而不是 head 中。 HTML 没有明确定义接下来会发生什么,因为它没有具体定义“robots”元标记。最终答案将是它取决于:既取决于您定义的元数据,又取决于提取它的人。如果抓取工具假定您的元标记位于头部,它根本不会注意到正文中的这个标记。
底线是,如果您坚持使用有效 HTML,则无需担心这些!