为什么此文档呈现为XML而非HTML5?

时间:2011-03-06 09:56:54

标签: html xml html5 lift

为什么下面的第二个文档被重新绑定为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> -->

2 个答案:

答案 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。