为什么下面的第二个文档被重新绑定为XML而不是HTML? document.constructor
变为XMLDocument
。
修改
当我从浏览器(而不是application/xhtml+xml; charset=utf-8
)发出请求时,Web服务器会回复curl
。我刚注意到,在使用Wireshark嗅探时。也许我不需要发布这个问题,因为我似乎错误地配置了Web服务器。
编辑2:这是一个Lift-Web问题(我使用的Web框架)。请参阅下面的回复。
(这为我打破了谷歌的SVG网站。在我的情况下,SVG Web可以正常使用HTML 但不是XML。我不知道如何让Web浏览器考虑 文档是HTML而不是XML - 我想我已经指定它不是HTML XML。)
下面的第一个文档虽然呈现为HTML。但我不能为我的生活找到
HTTP标头或第一个和第二个文档的<meta>
标签的任何相关差异!?
(我已经将它们分开了;只有一些不感兴趣的标题不同。)
特别是,这两个文件都指定了Content-Type: text/html; charset=utf-8
,
在HTTP标头和<meta>
标签中都有。
(除了HTTP标头和标签以及可能的文件后缀之外,浏览器是否会检查其他内容以获取内容类型?)
当我调试一些JavaScript代码时:
document.constructor === XMLDocument
适用于第一份文件,
document.constructor === HTMLDocument
适用于第二种情况。
浏览器:Google Chrome 9.0.597.83测试版。
以下是第一个文档及其HTTP标题,如curl
所示:(结果为HTML)
$ curl -v -v http://localhost/foo/content-type-html-test.html | head -n10
* About to connect() to localhost port 80 (#0)
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /foo/content-type-html-test.html HTTP/1.1
> ...
< HTTP/1.1 200 OK
< Date: Sun, 06 Mar 2011 09:06:42 GMT
< Server: Apache/2.2.14 (Ubuntu)
< Last-Modified: Sun, 06 Mar 2011 08:58:30 GMT
< ETag: "77402b-3bc4-49dcc95441980"
< Accept-Ranges: bytes
< Content-Length: 15300
< Content-Type: text/html; charset=utf-8
<
...curl shows download progress...
* Closing connection #0
<!DOCTYPE html>
<html xmlns:lift="http://liftweb.net/" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<meta content="" name="description" />
<meta content="" name="keywords" />
<title>Foo</title>
<!-- svg.js must the first script on the page. -->
<script src="./content-type-html-test_files/svg.js" type="text/javascript" data-path="/classpath/js" ></script>
<!--<script data-path="/classpath/js" type="text/javascript" src="/classpath/js/svg.js"></script> -->
<script src="./content-type-html-test_files/jquery-1.4.2.js" type="text/javascript" ></script>
第二个:(结果是XML)
$ curl -v -v http://localhost:8080/0/about.html | head -n10
* About to connect() to localhost port 8080 (#0)
* Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /0/about.html HTTP/1.1
> ...
< HTTP/1.1 200 OK
< Expires: Sun, 6 Mar 2011 09:07:35 UTC
< Set-Cookie: JSESSIONID=1p9o4y4cv2d531as8s5xrdysch;Path=/
< Content-Length: 11085
< Cache-Control: no-cache; private; no-store
< Content-Type: text/html; charset=utf-8
< Pragma: no-cache
< Date: Sun, 6 Mar 2011 09:07:35 UTC
< X-Lift-Version: 2.2
< Server: Jetty(6.1.25)
<
...curl shows download progress...
* Closing connection #0
<!DOCTYPE html>
<html xmlns:lift="http://liftweb.net/" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<meta content="" name="description" />
<meta content="" name="keywords" />
<title>Foo</title>
<!-- svg.js must the first script on the page. -->
<script src="/classpath/js/svg.js" type="text/javascript" data-path="/classpath/js"></script>
<!--<script data-path="/classpath/js" type="text/javascript" src="/classpath/js/svg.js"></script> -->
答案 0 :(得分:1)
我今天早上看了你的问题,看不出问题是什么,但现在我看到你的编辑,我想我知道它是什么。这就是Firefox中的典型请求(使用LiveHTTPHeaders):
GET / HTTP/1.1
Host: stackoverflow.com
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.2.14) Gecko/20110301 Fedora/3.6.14-1.fc14 Firefox/3.6.14
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
注意第Accept:
行。我怀疑您的服务器正在发送text/html
卷曲,因为它没有明确声明它可以支持application/xhtml+xml
。由于Firefox(以及可能不是IE的其他浏览器)确实声明了对它的支持,因此服务器使用该内容类型发送。
请注意,对于Web服务器来说,这通常是完全合理的事情,所以不是真正的配置错误,但我建议解决方案是将Jetty配置为始终以text/html
发送,无论{请求上的{1}}标题说明了。
答案 1 :(得分:1)
现在,Web服务器向所有浏览器发送HTML而不是XHTML。我使用的Web框架是Lift-Web,我不得不将此行添加到Lift-Web的Boot.scala中:
LiftRules.htmlProperties.default.set(
(r: Req) => new Html5Properties(r.userAgent))
如此处所述:http://www.assembla.com/wiki/show/liftweb/HtmlProperties_XHTML_and_HTML5
(以下是我认为你还需要做的一些事情:http://www.assembla.com/wiki/show/liftweb/Setting_the_DocType)
服务器现在说
了
Content-Type: text/html; charset=utf-8
代替
application/xml
。
所以现在文档呈现为HTML5。