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:

  • Maurício Rech

    você leu meu pensamento, tava pensando sexta feira que estava com duvidas sobre media types

    :P

  • Alessandro S. Angeru

    Nebuloso o futuro é…

    Mas eu ainda tenho esperança que a Microsoft acorde para a Web. A necessidade fará isso a ela.

    Enquanto isso, continuamos fazendo o possível dentre as limitações.

  • Alexandre

    Até um certo ponto eu defendo o pessoal do IE. Estou louco? Não.

    O Internet Explorer tem um engine feito visando compatibilidade. Por incrível que pareça. Não compatibilidade com documentos bem-formados, compatibilidade com porcarias, marcação mal-feita. O IE é o melhor browser pra abrir porcaria que existe, ele simplesmente abre, seja qual for a sopa de tags que você jogar lá.

    Quem leu o draft do XHTML 1.1 (o que EXIGE mimetype application/xhtml) sabe que o user agent DEVE acusar erros e impedir a continuação da renderização do documento. O parser tem que ser direto, se há erro ele para e avisa.

    Aí surgiu um grande dilema, se a equipe do IE7 aceitasse o mimetype certo, o seu parser não seria perfeito, porque ele visa justamente "burlar" probleminhas de marcação e abrir do mesmo jeito. Seria uma implementação falha! O que traria os mesmos problemas de não-padronização que o browser já tem hoje.

    A equipe do IE preferiu por tornar FOCO a implementação completa de HTML4.01 e CSS2, que na verdade é o que mais usamos hoje em dia. Espero que pelo menos isso eles façam direito…

    Enfim, teremos que nos acostumar com alternância dinâmica de mimetype, assim como acostumamo-nos com hacks em css.

  • Pingback: Carlos Soler » XHTML Media Types()

  • Jessé

    Gostaria de saber, na prática, um documento usando 100% da tecnologia do application/xhtml+xml. De que forma ela pode ser aplicada? Obrigado.

  • Alexandre Gomes Gaig

    Jessé, uma página de exemplo de um XHTML servido como application/xhtml+xml está disponível no site do W3C:

    http://www.w3.org/People/mimasa/test/xhtml/media-

    Se seu navegador abrir esse mimetype, você sequer notará diferença. Se não abrir, você pode ver um código, ou uma tela de download de arquivo…

    As vantagens de servir documentos como aplicação xhtml são, entre outras, rapidez e verificação de consistência. Além disso permite que você inclua XML com devidos namespaces declarados no meio da marcação, estendendo o XHTML padrão.

    Para servir um documento como application/xhtml+xml, você deve configurar seu servidor, ou então um script para alterar o Header.

    No PHP ficaria algo assim:

  • http://www.doufer.com.br Doufer

    O assunto parecia um tanto nebuloso…

  • Jonathan Santos

    Muito bom o artigo…

    Porém senti falta de uma direção. Como podemos criar documentos XHTML 1.1 que seja renderizado pelos browsers que não suportam essa linguagem?

    Existe uma caminho das pedras? Alguma sugestão?

    Abraço

  • Pingback: Mudei meu mime-type » Revolução Etc()

  • Pingback: O mime-type do Japs agora é application/xhtml+xml » Japs()

  • http://www.tudoin.com.br Luiz Júnior F

    Acaba-se que a microsoft consegue contudo tal como "controlar" as evoluções envolvidas no mundo tecnológico. Temos assim a idéia de quem tem um monopólio em suas mãos, acaba por ter também o poder de fazer com que as evoluções ocorram, ou se retardem, por que, parar, isso não consegue não.

  • Pingback: Declarando encodings em XHTML » Revolução Etc()

  • Adriano

    Gostaria de dizer meus parabéns e agradecer pelo muito bom artigo… Contudo, eu tenho um pouco de dificuldades para entender corretamente todas estas questões referente a mime, encode, etc…

    No seu site por exeplo quando eu visualizo o fonte dele pelo firefox eu vejo uma declaração xml logo no inicio, já no ie não o vejo. Como vc faz isso? ou isso é algo que o próprio browser já faz..

    Agradeço mais uma vez…

    valew e sucesso.

  • Pingback: Doctype - DTD - Document Type Definition » Revolução Etc - Web Standards em uma casca de noz!()

  • Pingback: rodrigoaramburu.br22 » Blog Archive » Character Set()

  • Pingback: HTML ou XHTML, qual escolher? at Emanuel Felipe .NET()

  • Pingback: Wagner Elias - Think Security First » Blog Archive » XML Firewall()

  • Pingback: Aramburu Blog » Blog Archive » Charset()

  • Pingback: Nagüeva » Blog Archive » Definindo a linguagem padrão da folha de estilos no HTML()

  • Pingback: Nagüeva » Blog Archive » Definindo a linguagem padrão do estilo aplicado no HTML()

  • Pingback: SWF Object 2 » Revolução Etc()

  • Pingback: iPhone on Rails 2.0 | Ruby Brasil()