¿Cómo sirvo XHTML a Internet Explorer sin romper Chrome?

8

Dirijo un foro que sirve sus páginas como XHTML + MathML + SVG; en su totalidad:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd">

Usando el complemento MathPlayer, los usuarios de Internet Explorer pueden usar este sitio. Sin embargo, a veces alguien está usando el foro de IE y no puede instalar MathPlayer (tal vez están en una máquina pública en algún lugar). Luego, IE (al menos 6 y 7) se queja del XHTML y ofrece solo descargar el archivo.

Leí en el sitio w3c cómo solucionar esto usando una transformación XSL ( http://www.w3.org/MarkUp/2004/xhtml-faq#ie ). Cuando puse esto en su lugar, descubrí que Chrome ahora se quejaba vociferantemente de entidades indefinidas (la específica era &nbsp;pero las pruebas muestran que eso no es relevante).

Curiosamente, puedo evitar esto declarando manualmente las entidades en el DOCTYPE:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd" [
<!ENTITY nbsp "&#160;">
]>

pero prefiero no hacer esto para toda la gama de entidades posibles. Digo "extrañamente" porque el XHTML + MathML + SVG dtd, por lo que puedo ver, declara estas entidades. Así que de alguna manera estos se están perdiendo.

¿Hay alguna forma de evitar este problema? ¿Puedo servir XHTML con entidades a IE?

En caso de que sea importante, las páginas son generadas por un script php y se sirven a través de apache, por lo que si hay un método confiable para rastrear el navegador y modificar el inicio del documento (por lo que solo se envía el <?xml-stylesheet ...>bit a IE), eso sería un alternativa aceptable

(Espero tener el sitio SE correcto ... avíseme si estoy en el lugar equivocado. Lo mismo ocurre con las etiquetas).

Andrew Stacey
fuente
Las preguntas HTML (CSS) puras (X) pertenecen a stackoverflow.com, pero la suya no es tan sencilla, ya que usted menciona una posible solución del lado del servidor, por lo que no la estoy señalando para moverla. Si no obtiene ninguna respuesta aquí, la eliminaría y la pondría allí. ¡Algunas preguntas HTML tienden a ser respondidas en segundos!
Paulmorriss
@paulmoriss: Gracias por la aclaración (¡parcial!). A veces, en la ciénaga de sitios SE consigo un poco perdido ...
Andrew Stacey
Al releer mi comentario, puede que no sea muy claro. Quiero decir "si fuera tú, lo eliminaría ...". Tu decides.
Paulmorriss
@paulmoriss: es un problema de configuración del lado del servidor, ya que se trata de hacer frente a un navegador que no puede manejar XHTML y cómo enviarles algo que puedan hacer frente. Al escanear la lista de preguntas "relacionadas", parece que hay muchas ideas similares. Pero no sé cuál es el alcance de este sitio (y cuanto más leo, más confuso me siento) y no he tenido ninguna respuesta, por lo que seguiré su consejo (dentro de poco).
Andrew Stacey

Respuestas:

1

[I] f existe un método confiable para olfatear el navegador y modificar el inicio del documento (por lo tanto, solo enviar el bit a IE), esa sería una alternativa aceptable.

Esta declaración PHP coincidirá con cualquier navegador que incluya "MSIE" en la cadena del agente de usuario y puede refinar los criterios agregando un número de versión, si lo desea:

$flag_is_ie = (false !== strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE'));

... con números de versión:

$flag_is_ie = (false !== strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.'));
$flag_is_ie = ( $flag_is_ie || (false !== strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7.')));
danlefree
fuente