在加载时获取文件扩展名时,浏览器会解释什么?
我尝试混合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 - 运气不好。页面看起来有点像它应该。 在这里看到两种变体:
当浏览器“改变主意”取决于文件扩展时,现在幕后发生了什么?
顺便说一句,我的RumyMine告诉我文件有什么问题,因为它有'html'扩展名(但不是什么)。
我更希望两者:告诉我会发生什么,并告诉我什么是正确的方式来做我想要的。
答案 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解析器一起使用。 (虽然我没有测试过这个。)