application/xhtml+xml に対応していない場合は text/html を吐くようにした

IE で見えるようにしました。 application/xhtml+xml に対応していない場合は、 text/html で返すように。本当はしたくなかったけれど。

application/xhtml+xml に対応しているかどうかは、次の条件式で。

preg_match( '/[,^]\s*application\/xhtml\+xml\s*([,;$])/', $_SERVER["HTTP_ACCEPT"] ) > 0

XHTML1.1 に正しい MIME Type を - Code-404 で掲載されている PHP のコードはちょっと正しくありません。 HTTP_ACCEPT の値がカンマの後にスペースが入っていたり application/xhtml+xml の後に ;q=0.9 のようなのが入っていたら判定ミスします。( Opera が前者で判定ミスされます )仕様書も見たわけじゃないので、上記の正規表現が完璧かは分かりません。

で、 application/xhtml+xml に対応していない IE に text/html で配信することは出来ました。 IE7 で確認して問題なし。

IE6 では謎のエラーが出ました。

CSS スタイル シートを使用した XML 入力は表示できません。エラーを訂正してください。 [更新] ボタンをクリックするか、または後でやり直してください。

使用する前にパラメータ エンティティを定義しなければなりません。リソース'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd' の実行エラーです。ライン 100、位置 2

%xhtml-prefw-redecl.mod;
-^

どうやら xml-stylesheet 命令あたりに原因がありそうなので、 application/xhtml+xml に対応していない IE には XML 宣言と xml-stylesheet 命令を出力しないようにしました。

最終的なコードは以下のような感じです。

if( preg_match( '/[,^]\s*application\/xhtml\+xml\s*([,;$])/', $_SERVER["HTTP_ACCEPT"] ) > 0 ) {
    header( 'Content-Type: application/xhtml+xml; charset='. get_bloginfo('charset') );
    echo '<?xml version="1.0" encoding="'. get_bloginfo('charset') . '" ?>'. "\n";
    echo '<?xml-stylesheet href="'. get_bloginfo('stylesheet_url') . '" type="text/css" media="all" charset="UTF-8" ?>'. "\n";
} else {
    header( 'Content-Type: text/html; charset='. get_bloginfo('charset') );
}

インフォメーション

公開日時
2007年9月11日 午後11時28分14秒
最終更新日時
2007年12月29日 午前9時40分34秒
カテゴリ
WordPress