当文件加载文件扩展名到浏览器(如狐狸或歌剧)时,场景背后会发生什么?

时间:2013-09-22 19:49:38

标签: html xml svg dtd

在加载时获取文件扩展名时,浏览器会解释什么?

我尝试混合html,svg和dtd(实体)。我尝试以有效的方式做到这一点。但现在是一个我不明白的问题的立场。我做了:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html [
            <!ENTITY duration "3s">
            ...
            ...
    <div style='width:100%; border:1px solid black;'>high there</div>
    <p>toaster</p>
    <hr/>
    <svg width="600" ... 

我的'page'显示效果很好,我的Rubymine'读取'了没有任何注释的文件。

只要文件扩展名为 SVG (即index.svg)。如果我将其更改为 HTML - 运气不好。页面看起来有点像它应该。 在这里看到两种变体:

svghtml

当浏览器“改变主意”取决于文件扩展时,现在幕后发生了什么?

顺便说一句,我的RumyMine告诉我文件有什么问题,因为它有'html'扩展名(但不是什么)。

我更希望两者:告诉我会发生什么,并告诉我什么是正确的方式来做我想要的。

1 个答案:

答案 0 :(得分:3)

这与处理扩展程序的浏览器无关,但它始于服务器处理扩展程序的方式。

事实上,the spec说:

  

文件扩展名不用于确定提供的MIME类型   通过HTTP检索的资源,因为它们不可靠且容易   欺骗。

当页面作为http://keepitsimple-soft.com/question.html提供时,您的Apache服务器在响应中包含此HTTP标头:Content-Type: text/html,因此浏览器知道它是一个HTML页面并使用HTML解析器来读取它。 HTML解析器不处理DOCTYPE中的那些实体定义,因此无法在SVG中正确解释它们。

当页面作为http://keepitsimple-soft.com/question.svg提供时,服务器在响应中包含此HTTP标头:Content-Type: image/svg+xml。在这种情况下,浏览器识别“+ xml”部分并使用其XML解析器解析文件。这确实解释了实体定义,因此可以完全处理SVG。

就你应该做的事情而言,你可以使用XHTML并坚持使用XML解析器,或者在通过网络发送页面之前解析实体定义,在这种情况下,你的页面应该与HTML解析器一起使用。 (虽然我没有测试过这个。)