Eli olen nyt saanut sivujeni ulkoasun jonkimoiseen kuntoon, mutta nyt kun katson sivua IE:llä se alkaa lataamaan sitä.
Content-typen lähetän seuraavalla koodilla:
<?php header('Content-Type: application/xhtml+xml; charset=UTF-8'); ?>
Jos taas poistan sivun, tai laitan tuon lähettämään normaalin html-sivun headerit homma toimii.
Eli miten tuon voisi korjata. Pitäisikö tunnistaa selain ja jos se on IE lähettää eri headeri?
Jep, IE täytyy sniffiä ja lähettää sille text/html. Se ei tajua mitään application/xhtml+xml:n päälle (eikä edes omien tapojensa vastaisesti yritä edes automaattisesti tunnistaa tiedostomuotoa, mitä turhankin usein tekee).
Joskus muinoin kopsailin jostakin seuraavanlaisen pätkän tähän tarkoitukseen ja kyllähän tämä on näyttänyt toimivan.
<?php $mime = "text/html"; if(stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml")) { if(preg_match("/application\/xhtml\+xml;q=([01]|0\.\d{1,3}|1\.0)/i",$_SERVER["HTTP_ACCEPT"],$matches)) { $xhtml_q = $matches[1]; if(preg_match("/text\/html;q=q=([01]|0\.\d{1,3}|1\.0)/i",$_SERVER["HTTP_ACCEPT"],$matches)) { $html_q = $matches[1]; if((float)$xhtml_q >= (float)$html_q) { $mime = "application/xhtml+xml"; } } } else { $mime = "application/xhtml+xml"; } } header("Content-Type: $mime;charset=UTF-8"); ?>
EDIT: UTF-8 :)
Joo, kiitti avusta. Pitänee tuota koodia testata kunhan pääsen omalle koneelle. Näyttäisi kuitenkin ensisilmäykseltä ihan toimivalta.
Ite olen käyttänyt tälläistä, varmaan kummatkin ajaa saman asian. Alla oleva pätkä kannattaa siis tallettaa omana tiedostona(mime.php) ja sitte lisää sen näin:
<?php include('mime.php'); ?>
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" />
</head>
<?php $charset = "iso-8859-1"; $mime = "text/html"; function fix_code($buffer) { return (str_replace(" />", ">", $buffer)); } if(stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml")) { # if there's a Q value for "application/xhtml+xml" then also # retrieve the Q value for "text/html" if(preg_match("/application\/xhtml\+xml;q=0(\.[1-9]+)/i", $_SERVER["HTTP_ACCEPT"], $matches)) { $xhtml_q = $matches[1]; if(preg_match("/text\/html;q=0(\.[1-9]+)/i", $_SERVER["HTTP_ACCEPT"], $matches)) { $html_q = $matches[1]; # if the Q value for XHTML is greater than or equal to that # for HTML then use the "application/xhtml+xml" mimetype if($xhtml_q >= $html_q) { $mime = "application/xhtml+xml"; } } # if there was no Q value, then just use the # "application/xhtml+xml" mimetype } else { $mime = "application/xhtml+xml"; } } # special check for the W3C_Validator if (stristr($_SERVER["HTTP_USER_AGENT"],"W3C_Validator")) { $mime = "application/xhtml+xml"; } # set the prolog_type according to the mime type which was determined if($mime == "application/xhtml+xml") { $prolog_type = "<?xml version='1.0' encoding='$charset' ?> <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1//EN' 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'> <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>"; } else { ob_start("fix_code"); $prolog_type = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd'> <html lang='en'>"; } # finally, output the mime type and prolog type header("Content-Type: $mime;charset=$charset"); header("Vary: Accept"); print $prolog_type; ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.