使用正确的MIME类型提供XHTML

时间:2011-05-15 15:12:33

标签: php html xml xhtml mime-types

只要我记得,我就会努力以正确的方式做事。好吧,无论如何,我认为这是正确的方式。

现在我觉得是时候一劳永逸地回答一些非常重要的问题了。

所有发誓XHTML的人迟早会偶然发现这句话:“除非您提供正确的MIME类型,否则您的文档将被解释为常规HTML”

说什么?我已经创建了一个完美的XHTML文档,遵循所有标准和内容。我做错了什么?我错过了什么?

据我了解,它在很大程度上是服务器的东西,所以当然我也调查了这一点,看起来PHP函数header()似乎是问题的答案。

是的,那么一切都很好。不,实际上并非如此,因为无论我搜索网络多少,我根本无法找到有关如何解决问题的一致信息,当我找到与远程相关的东西时,它就是浏览器的可比性等等。

尽可能清楚地说。

我不关心浏览器的可计算性。 (不管怎么说)

如果我犯了错误,当然我知道如何实现这一点,我真正想要的就是接收XML类型的史诗失败消息。

简而言之,我希望能够采用SGML方式并采用XML方式,我希望能够在没有任何疑问的情况下说这个文档是有效的XML / XHTML并且被解释为

我的想法是,我可以通过PHP脚本简单地要求有问题的XHTML文档,并使用适当的MIME类型发送它,但是由于网络上的信息冲突,它实际上是如何完成的仍然是个谜。

我希望有人能够提供我正在寻找的答案,最好提供相关信息的链接以备份它。如果你能为我做到这一点,我将永远感激。

最好的问候。

编辑: 我不能说我理解为什么或如何,但至少我找到了一种方法,让它按照应有的方式行事,只需添加: 在常规xhtml文档的顶部,当然将文件类型更改为PHP以实际运行脚本。

我很确定这不是故事的结局,但现在我很开心。

2 个答案:

答案 0 :(得分:5)

如果您强制使用/xhtml+xml标题,则IE将不再解释您的网页。这就是为什么没有人真正麻烦做正确的事。 (这就是我在另一个网站上做的原因。)

但是,可以让您的网络服务器处理正确MIME类型的发送。通常你可以让mod_negotiation处理它。但是,这需要每个文档有两个版本:

index.en.html
index.en.xhtml

然后,如果请求了url / resource /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解析错误,这可能是一个半可行的选择。

答案 1 :(得分:2)

要使浏览器解析器使用XML解析器解析XHTML,必须使用XML Mime Type

HTML5将其定义为:

  

术语XML MIME类型用于   引用MIME类型text / xml,   application / xml和任何MIME类型   其子类型以四个结尾   字符“+ xml”。 [RFC3023]

最常见的mime类型是application/xhtml+xml,但它远非唯一可能的类型。