最近开始,我的一些新网页(XHTML 1.1)被设置为对请求头Accept
进行正则表达式,并在用户代理接受XML的情况下发送正确的HTTP响应头(Firefox和Safari支持)。
IE(或任何其他不接受它的浏览器)只会收到纯文本/HTML内容类型。
谷歌机器人(或其他任何搜索机器人)会有任何问题吗?是否存在我已经检查过的任何负面影响?您认为这个头部嗅探器对性能会产生很大影响吗?
最近开始,我的一些新网页(XHTML 1.1)被设置为对请求头Accept
进行正则表达式,并在用户代理接受XML的情况下发送正确的HTTP响应头(Firefox和Safari支持)。
IE(或任何其他不接受它的浏览器)只会收到纯文本/HTML内容类型。
谷歌机器人(或其他任何搜索机器人)会有任何问题吗?是否存在我已经检查过的任何负面影响?您认为这个头部嗅探器对性能会产生很大影响吗?
我使用内容协商来在application/xhtml+xml
和text/html
之间进行切换,就像您描述的那样,没有注意到搜索机器人的任何问题。严格来说,您应该考虑接受标头中的q值,该值指示用户代理对每个内容类型的偏好。如果用户代理更喜欢接受text/html
但愿意接受application/xhtml+xml
作为备选,则为了最大安全性,您应该将页面作为text/html
提供。
内容协商(以及向不同的用户代理提供不同的内容/头文件)的一个问题是代理服务器。考虑以下情况;我在Netscape 4时代遇到过这个问题,并一直对服务器端探测感到害羞。
用户A使用Firefox下载您的页面,并获得XHTML/XML内容类型。用户的ISP在用户和您的站点之间有代理服务器,因此该页面现在被缓存。
用户B与同一ISP,使用Internet Explorer请求您的页面。请求先到达代理,代理说“嘿,我有那个页面,给你,格式为application/xhtml+xml”。用户B被提示下载该文件(因为IE会下载任何作为application/xhtml+xml发送的内容)。
您可以通过使用“变量头”解决此特定问题,如本文所述的 456 Berea Street 文章。我也假设代理服务器对于自动检测这些东西已经变得更加智能。
这里是HTML/XHTML中“CF”开始潜入的地方。当您使用内容协商向一组用户代理提供application/xhtml+xml,并向另一组用户代理提供text/html时,您依赖于服务器和用户之间的所有代理都表现良好。
即使全世界的代理服务器都聪明到可以识别Vary标头(实际上它们并不能),您仍然必须应对全球的计算机管理员。世界上有很多聪明、有才能和专注的IT专业人员。但也有更多不那么聪明的人,他们整天双击安装程序,认为“互联网”就是他们菜单中那个蓝色的E。配置不当的代理仍可能不正确地缓存页面和标头,让您运气不佳。
唯一真正的问题是,如果您的页面包含无效代码,浏览器将显示xml解析错误,而在text / html中,它们至少会显示可查看的内容。
除非您想嵌入SVG或正在对页面进行XML处理,否则发送XML实际上没有任何好处。
问题是你需要将标记限制为 HTML 和 XHTML 的子集。
<script/>
is unclosed to text/html
parser and will kill document up to next </script>
).text/html
mode (may use XML-only features mentioned in previous point, may add tagname prefixes (PHP DOM sometimes does <default:h1>
). <script>
is CDATA in HTML, but XML serializer may output <script>if (a && b)</script>
).&
in href
or <br>
will completely break XML, and make your site appear to work only in IE!)我已经测试了我基于 XML 的网站的索引。即使我使用了 application/xml
MIME 类型,它也被索引了,但它似乎被解析为 HTML(谷歌没有索引在 <[CDATA[ ]]>
部分中的文本)。
由于IE不支持xhtml作为application/xhtml+xml,获得跨浏览器支持的唯一方法是使用内容协商。根据Web Devout的说法,由于通配符的误用,内容协商很难,其中Web浏览器声称支持存在的每种内容类型! Safari和Konquer支持xhtml,但仅通过通配符暗示此支持,而IE不支持此支持,但也暗示支持。
W3C建议只向HTTP Accept头文件明确声明支持的浏览器发送xhtml,并忽略那些没有明确声明支持的浏览器。但请注意,头文件并不总是可靠的,这已知会导致缓存问题。即使您可以让这个工作,维护两个相似但不同版本仍会很麻烦。
鉴于所有这些问题,当你的工具和库允许时,我支持放弃使用xhtml。