XHTML Media Types

Meses atrás eu passei um longo período tentando entender os media types. Fiz algumas confusões na época, cometi alguns enganos básicos próprios de quem estava começando a entender. Eu quis escrever este texto como uma forma de remir meus erros do passado e deixar registrado aqui um resumo do que a W3C recomenda para os Media Types quase que em um formato de dossiê. Seus comentários sobre meu texto são essenciais como um feedback.

MIME Types

Quando um servidor envia documentos para os user agents (como os browsers ou os mecanismos de busca por exemplo) ele envia um pacote com certas informações que você não vê (meta-informações) sobre o tipo de dados que o documento contêm. Estas informações são enviadas em um campo conhecido como “content-type”, e são expressadas através de um mime-type.

MIME é uma abreviação de Multi-purpose Internet Mail Extensions e inicialmente foi criado para resolver um problema similar de informar os tipos de conteúdo (media-type) anexados em e-mails e reutilizado para o protocolo HTTP. Ou seja, o mime-type indica como o user agent deve tratar o documento que ele recebe.

Veja um exemplo de um content-type de um arquivo de HTML com mime-type “text-html”:


HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
Content-Location: CSS2-REC.en.html
Vary: negotiate,accept-language,accept-charset
TCN: choice
P3P: policyref=http://www.w3.org/2001/05/P3P/p3p.xml
Cache-Control: max-age=21600
Expires: Wed, 05 Nov 2003 16:46:04 GMT
Last-Modified: Tue, 12 May 1998 22:18:49 GMT
ETag: "3558cac9;36f99e2b"
Accept-Ranges: bytes
Content-Length: 10734
Connection: close
Content-Type: text/html; charset=utf-8
Content-Language: en

Como eu disse anteriormente, essas informações você não as vê, são meta-informações (informações sobre as informações) que são enviadas aos user agents para informar que tipo de documento eles estão recebendo. Veja abaixo uma tabela com o resumo das recomendações da W3C do uso correto do mime-type e seus respectivos contextos:

Media types summary for serving XHTML documents
Media typeHTML 4XHTML 1.0 (HTML compatible)XHTML 1.0 (other)XHTML Basic / 1.1XHTML+MathML
text/htmlDEVEPODENÃO DEVENÃO DEVENÃO DEVE
application/xhtml+xmlNÃO DEVEDEVEDEVEDEVEDEVE
application/xmlNÃO DEVEPODEPODEPODEPODE
text/xmlNÃO DEVEPODEPODEPODEPODE

Eu posso ou não usar “text/html” no meu site em XHTML?

Sim você pode. Só se você estiver usando a versão 1.0 do XHTML. Mas se você quer servir seu XHTML 1.0 como XML você também pode, mas deve usar mime-type “application/xhtml+xml”. Se você ler no “Abstract” do documento XHTML Media Types da W3C, de início traz o seguinte:

“This document summarizes the best current practice for using various Internet media types for serving various XHTML Family documents. In summary, ‘application/xhtml+xml’ SHOULD be used for XHTML Family documents, and the use of ‘text/html’ SHOULD be limited to HTML-compatible XHTML 1.0 documents. ‘application/xml’ and ‘text/xml’ MAY also be used, but whenever appropriate, ‘application/xhtml+xml’ SHOULD be used rather than those generic XML media types.”

Em livre tradução seria o seguinte:

Este documento resume as boas práticas para o uso de vários Internet Media Types para servir vários documentos da família XHTML. Em resumo, “application/xhtml+xml” DEVE ser usado para os documentos da família XHTML, e o uso de “text/html” DEVE ser limitado aos documentos compatíveis com o HTML, ou seja os documentos em XHTML 1.0. Os mime-types “aplplication/xhtml+xml” e “text/xml” PODEM também ser usados, mas quando for mais apropriado, “application/xhtml+xml” DEVEM ser usados preferivelmente do que os media types de XML genéricos.

Não se confunda!

A meta tag http-equiv=”content-type” não determina qual será o media-type que seu servidor vai enviar seu XHTML. Por mais que você possa encontrar o trecho a seguir no código fonte de qualquer site, não é ele que determina se meu site deve ser servido ou não como “text/html” ou como “application/xhtml+xml”:


<meta http-equiv="content-type" content="text/html;
charset=utf-8" />
<meta http-equiv="content-type" content="application/xhtml+xml;
charset=utf-8" />

São as configurações do seu servidor (e não meta tags) que determinam como seu site é servido aos user agents mas elas podem apenas servir como fallback pro user agent, caso não ele não encontre nenhuma outra informação como me lembrou o Bruno.

text/html

O media type “text/html” foi primeiramente criado para o HTML e não para o XHTML. Entretato, como este documento de Dan Connolly diz: “XHTML1 defines a profile of use of XHTML which is compatible with HTML 4.01 and which may also be labeled as text/html.” Ou seja, o XHTML 1.0 pode ser servido como “text/html” e não há discussão para isso.

O famoso e muito citado apêndice C da especificação para o XHTML 1.0 não contradiz estas informações, pelo contrário, no ínicio dele apenas diz que resume para os autores que querem que seus documentos escritos em XHTML sejam renderezados pelos user agents de HTML e em nenhum momento define COMO eles devem ser renderizados e que tipo de media type eles devem usar conforme o trecho:


This appendix is informative.
This appendix summarizes design guidelines for authors who wish their XHTML documents to render on existing HTML user agents. Note that this recommendation does not define how HTML conforming user agents should process HTML documents. Nor does it define the meaning of the Internet Media Type text/html. For these definitions, see [HTML4] and [RFC2854] respectively.

O uso do media-type “text/html” DEVE ser limitado com o propósito de renderizar em um user agent de HTML e DEVE ser limitado ao XHTML 1.0 somente. Usar “text/html” NÃO é apropriado para os documentos da família XHTML principalmente os que utilizam namespaces como o XHTML+MathML. Em resumo, XHTML servido como text/html não é processado como XML e sim como HTML.

E o que o futuro diz?

O maior de todos os problemas, o maior de todos os pesadelos que você que é desenvolvedor poderia ter, se chama Microsoft Internet Explorer. Vou apontar algumas razões.

O Internet Explorer hoje é praticamente o único browsers que não renderiza documentos servidos como “application/html+xml”. Todos os browsers modernos já suportam. Se você tem interesse em servir um site em XHTML servido como XML, você terá que criar soluções dinâmicas para identificar se o browser é o Internet Explorer e servir algo em “text/html” pra ele. Se você pensar em termos comerciais isso é um prejuizo gigantesco e não é questão de “preguiça”. No final, você acaba tendo que criar soluções paliativas para um único browser pela falta de interoperabilidade dele. E considerando a balança de que o Internet Explorer é o browser com muito mais de 80% do mercado, ele acaba impedindo o crescimento e expanção da Web Semântica de forma integral.

Internet Explorer 7

De acordo com o texto The prolog, strict mode, and XHTML in IE, publicado em 15 de setembro de 2005 no Blog oficial do Internet Explorer a versão 7 do browsers azul não vai implementar o mime-type “application/xhtml+xml” no seguinte trecho: “I should say that IE7 will not add support for this MIME type – we will, of course, continue to read XHTML when served as “text/html”, presuming it follows the HTML compatibility recommendations.”

O Internet Explorer 6 foi lançado em outubro de 2001 e se a versão 7 realmente sair este ano, foram ao todo 5 anos entre uma versão e outra. Se tivermos fé e esperança de que pelo menos na versão 8 o Internet Explorer seja capaz de interpretar documentos servidos em “application/xhtml+xml” (vamos dar mais 5 anos para o Bill Gates se interessar em produzir uma outra versão?) e mais alguns 5 anos até que o mundo inteiro esteja utilizando de forma unânime browsers que sejam compatíveis com XHTML 1.1, teremos mais alguns 9 a 10 anos até que comercialmente seja viável investir em alguma tecnologia servida como XML. E como disse o Bruno Torres até lá provavelmente teremos uma versão superior do XHTML 1.1. Quem sabe uma versão 2.0 ou 3.0?

Referências: