从我记事起,我就努力以正确的方式做事。好吧,无论如何,我认为正确的方式是这样的。
现在我觉得是时候彻底回答一些非常重要的问题了。
所有信奉 XHTML 的人迟早都会偶然发现这句话:“除非您提供正确的 MIME 类型,否则您的文档将被解释为常规 HTML”
说什么?我已经创建了一个完美的 XHTML 文档,遵循所有的标准和内容。我做错了什么?我错过了什么?
据我了解,这在很大程度上是服务器的事情,所以我当然也调查了这一点,看起来 PHP 函数 header() 就是问题的答案。
是的,那么一切都好。好吧,不,事实上不是,因为无论我在网络上搜索多少,我根本无法找到有关如何解决问题的一致信息,而当我确实找到一些远程相关的信息时,这都是关于浏览器可比性等的。
尽量说清楚。
我不太关心浏览器的可计算性。 (反正不是现在)
我真正想要的是在我犯了错误时收到 XML 类型的史诗失败消息,当然还有关于我如何实际实现这一点的知识。
简而言之,我想放弃 SGML 方式并拥抱 XML 方式,并且我希望能够毫无疑问地说该文档是有效的 XML/XHTML 并被如此解释。
我的想法是,我可以简单地通过 PHP 脚本请求相关的 XHTML 文档,并使用正确的 MIME 类型发送它,但由于网络上的信息相互冲突,它实际上是如何完成的仍然是一个谜。
我确实希望有人能够提供我正在寻找的答案,最好提供相关信息的链接来支持它。如果您能为我做到这一点,我将永远感激不已。
致以诚挚的问候。
编辑: 我不能说我理解为什么或如何,但至少我找到了一种方法让它发挥应有的作用,只需添加:
<?php header("Content-type: application/xhtml+xml"); ?>
到常规 xhtml 文档的顶部,当然将文件类型更改为 PHP 以使其实际运行脚本。
我很确定这不是故事的结局,但现在我很高兴。
如果您强制使用
/xhtml+xml
标题,那么 IE 将不再解释您的页面。这就是为什么没有人真正费心去做正确的事情。 (这也是我在另一个网站上这样做的原因。)
但是,可以让您的网络服务器处理正确 MIME 类型的发送。通常你可以让 mod_negotiation 处理这个问题。然而,这需要每个文档有两个版本:
index.en.html
index.en.xhtml
然后,如果请求 url/资源
/index
,它将自动确定适当的文档版本,并使用正确的媒体类型发送。但是,它并不能真正理解序列化格式的类型差异,也不能设置优先级。提供两个具有相同内容的文件从一开始就不太合理。
因此,更简单的方法是使用 mod_rewrite 来处理 MIME 类型切换:
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml
RewriteRule .+\.xhtml$ - [T=text/html]
这将为所有 .xhtml 文档发送配置的标头,但如果浏览器不指示 XHTML 支持,则覆盖该标头。这还不太完整,因为为了避免代理问题,如果您手动进行任何类型的内容协商,您还需要设置 Vary: 标头。这需要 mod_header:
RewriteRule .+\.xhtml$ - [E=VARY_XHTML:1]
Header append Vary "Accept" env=VARY_XHTML
您可以使用 PHP 脚本包装器执行相同的操作,但是这样您就失去了让服务器处理它的所有好处。不管怎样,这都需要付出很大的努力,这就是为什么几乎没有人真正做到这一点。但如果您确实想要 XML 解析错误,这可能是一个半可行的选项。
要让浏览器解析器使用 XML 解析器解析 XHTML,必须提供 XML Mime 类型
HTML5 将其定义为:
术语 XML MIME 类型用于 参考 MIME 类型 text/xml, application/xml 以及任何 MIME 类型 其子类型以四个结尾 字符“+xml”。 [RFC3023]
最常见的哑剧类型是
application/xhtml+xml
,但它远非唯一可能的类型。