2

我想看看如果我向浏览器发送无效(根据 XHTML 标准)标记会发生的错误。我google chrome用作浏览器、apache服务器和php脚本语言。我创建了一个包含这样行的脚本:

header('Content-type:  application/xhtml+xml');

$content = <<< XHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
   <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
   <title>XHTML</title>
 </head>
 <BODY>
   <P>Lorem ipsum dolor sit amet...</P>
 </BODY>
</html>
XHTML;

echo $content;

它应该是不正确的,因为BODY来自大写字母。但我得到了正确的结果,因为我看到google chrome接受这样的 mime 类型:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

所以它将结果解释为text/html一切都很好。

我想让这个文件无效。如何text/html从接受的标题中删除google chrome?还是我错了?

UPD 当我删除结束BODY标签时,我可以看到一个错误。似乎浏览器不关心这些小错误。

4

2 回答 2

4

你误诊了问题。

  • 接受标头告诉服务器 HTML 和 XHTML 是同等首选的。
  • 您的脚本完全忽略了接受标头并发送 XHTML 内容类型
  • XML 解析器不会在格式正确的文档上抛出解析错误,即使它们是无效的
  • 当前的浏览器(据我所知,我已经有一段时间没有尝试过了)如果它们获得非格式良好的 XHTML(因为告诉最终用户页面作者创建的类型是 99),它们将退回到 HTML 解析器/100 次,无济于事)。

如果您想检测有效性错误,请使用验证器(旨在检测它们的工具)而不是浏览器(旨在呈现网页并从作者错误中恢复的工具)。

于 2013-09-18T10:35:17.683 回答
0

所以它将结果解释为 text/html 并且一切都很好。

我想让这个文件无效。如何从谷歌浏览器接受的标题中删除文本/html?还是我错了?

尽管浏览器会在标头中发送几种内容类型Accept,但服务器可以在响应中选择其中一种。

这是通过Content-Type在响应中设置标题来完成的(就像你做的那样)

header('Content-Type: application/xhtml+xml');

这告诉浏览器响应是一个 XHTML 文档。您没有更多机会影响浏览器的验证过程。

似乎 chrome 过于宽容并接受大写的<BODY>.

于 2013-09-18T10:34:42.320 回答