Почему этот документ отображается как XML, а не HTML5? - PullRequest
2 голосов
/ 06 марта 2011

Почему второй документ приведен ниже как XML, а не HTML? document.constructor становится XMLDocument.

EDIT Веб-сервер отвечает application/xhtml+xml; charset=utf-8, когда я отправляю запрос из браузера (вместо curl). Я только заметил, когда нюхал с Wireshark. Возможно, мне не нужно было публиковать этот вопрос, так как кажется, что я неправильно настроил веб-сервер.

РЕДАКТИРОВАТЬ 2: Это была проблема Lift-Web (веб-инфраструктура, которую я использую). Смотрите мой ответ ниже.


(Это нарушает Google SVG Web для меня. SVG Web отлично работает, в моем случае, с HTML но не XML. И я понятия не имею, как заставить веб-браузер учитывать документ HTML, а не XML - думаю, я уже указал, что HTML не XML.)

Документ first ниже представлен как 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 ]

1 голос
/ 09 марта 2011

Теперь веб-сервер отправляет HTML не XHTML всем браузерам.Я использую веб-фреймворк Lift-Web, и мне пришлось добавить эту строку в Boot.scala Lift-Web:

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.

1 голос
/ 07 марта 2011

Я прочитал ваш вопрос сегодня утром и не мог понять, в чем проблема, но теперь я видел ваше изменение, я думаю, что знаю, что это такое.Вот как выглядит типичный запрос в 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 в curl, потому что он явно не заявляет, что он может поддерживать application/xhtml+xml.Поскольку Firefox (и, вероятно, другие браузеры, не являющиеся IE) действительно объявляют о его поддержке, сервер отправляет с этим типом контента.

Обратите внимание, что это обычно вполне разумная вещь для веб-сервера, поэтомуна самом деле ошибка конфигурации, но я хотел бы предложить, чтобы решение было сконфигурировать Jetty так, чтобы оно всегда отправлялось как text/html независимо от того, что в заголовке Accept: указано в запросе.

...