1. XHTML1.1 に適した MIME Type
    1. IE の問題
  2. application/xhtml+xml を解釈しない UA への対策
    1. 静的ファイルの場合
    2. Perl の場合
    3. PHP の場合
    4. Movable Type では
  3. コメント (3)
  4. トラックバック (6)
更新日時
2009-02-12 18:54
永続的 URI
http://www.code-404.net/articles/web/mime-type4xhtml11
タグ

XHTML1.1 に適した MIME Type

XHTMLHTML とは違い、 XML の規則に従い定義し直した為、 MIME Type (Content-Type) に text/html を返すのは誤りになります。 (但し、 XHTML1.0 では後方互換の為、誤りとはならない場合もあります。) XHTML に適した MIME Type は application/xhtml+xml です。他に application/xml 、 text/xml も認められてます。

XHTML ファイルの拡張子が html の場合はサーバーの設定ファイル (httpd.conf) 、あるいは分散設定ファイル (.htaccess) に以下のように記述します。

AddType application/xhtml+xml html

IE の問題

ウェブブラウザで最も普及していると言われる IE は application/xhtml+xml に対応しておらず、 application/xml 、 text/xml を返したとしても名前空間の指定でエラーを返し、ページを表示できません。

今回はこのような application/xhtml+xml を解釈しない UA を考慮した設定の仕方を紹介します。

application/xhtml+xml を解釈しない UA への対策

一般的な UA は自分が解釈出来る MIME Type を Accept に設定しサーバーへ送信します。この Accept に application/xhtml+xml が含まれていれば、それを。含まれていなければ text/html を返します。

静的ファイルの場合

主に XHTML ファイルが対象になります。静的ファイルの場合、 MIME Type を返す役目を果たすのはサーバーです。この方法は application/xhtml+xml と mod_rewrite に詳しく書かれていますので参照してください。もし、あなたがサーバー管理者ではなく、 mod_rewrite を使用出来る環境か分からない場合は以下のようにするといいでしょう。

AddType text/html html

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
    RewriteCond %{LA-F:REQUEST_FILENAME} \.html
    RewriteRule .* - "[T=application/xhtml+xml]"
</IfModule>

application/xhtml+xml と mod_rewrite には、ディレクトリインデックスの場合も、application/xhtml+xml にならないことですとありますが私の環境では再現できませんでした。

残念ながら設定ファイルの編集・設置が許されていないなら、後述する PHP の対策を参照してください。

Perl の場合

スクリプト内で MIME Type を出力する際、以下のように記述します。

my $mime = $ENV{'HTTP_ACCEPT'} =~ m!application/xhtml\+xml! ? 'application/xhtml+xml' : 'text/html';
print "Content-Type: $mime\n\n";

もし、 CGI モジュールを使用しているなら、以下のようにも設定出来ます。

my @mime = grep m!application/xhtml\+xml!, $q->Accept();
$mime[0] = 'text/html' if !@mime;
print $q->header($mime[0]);

$qCGI モジュールを格納した変数に変更してください。

PHP の場合

適切なコードが Strict-HTML スレッド 30 にて紹介されていました。ファイルの冒頭に以下のように記述します。

<?php
    if (isset($_SERVER["HTTP_ACCEPT"])) {
        $HA = explode(",", $_SERVER["HTTP_ACCEPT"]);
        if (in_array("application/xhtml+xml", $HA)) {
            header("Content-Type: application/xhtml+xml");
        } else {
            header("Content-Type: text/html");
        }
    } else {
        header("Content-Type: text/html");
    }
?>

全ての PHP ファイルから上記のコードをインクルードするといいでしょう。

Movable Type では

Movable Type に於いては、 CGI 経由の対策のみ書き留めておきます。 (なぜなら前述しているからです。) 主に XHTML を吐き出す CGI は mt-comments.cgi 、 mt-trackback.cgi 、 mt-search.cgi の 3 つでしょう。これらはそれぞれ /lib/MT/App/Comments.pm 、 /lib/MT/App/Trackback.pm 、 /lib/MT/App/Seach.pm というファイルで色々と設定されています。これらのファイルには次のコードを共通して挿入する事になります。

    $app->set_header('Content-Type' => 'application/xhtml+xml')
        if $app->get_header('Accept') =~ m!application/xhtml\+xml!;

挿入する位置は次のとおりです。

/lib/MT/App/Comments.pm
view 関数、 do_preview 関数の最後の行の手前
/lib/MT/App/Trackback.pm
view 関数の最後の行の手前
/lib/MT/App/Seach.pm
execute 関数の最後の行の手前

もし、 Tagwire と MT-XSearch による動的タグアーカイブをサイトに適用しているなら、 mt-xsearch.cgi の eval 関数の最後の行を以下のように変更します。

    my @mime = grep m!application/xhtml\+xml!, $q->Accept();
    $mime[0] = 'text/html' if !@mime;
    print $q->header(-type=>$mime[0],-charset=>$charset).$out;

コメント

kazz - 2006-07-03 19:45

えーっと、2発目のトラックバックも送ってみたのですが、やっぱり「403 Throttled」となってしまったみたいです^^;

スパムのせいで通常のトラックバックまで妨げられるのでは大変ですね。お察しします。

ところで、自分が気にしていたのは、補足的とはいえ勝手に改変(追記)したところがあった、ということも含まれていたのですが、それもOKという認識でよろしいのでしょうか?

シンヤ - 2006-07-03 19:58

あれ、また 403 が返されましたか。どうしてだろう。暫く原因追求してみようかと思います。

引用に補足的追記をされるのは問題ありませんし、読み手にとって分かりやすさが向上するので良いことだと考えています。

kazz さんの場合は、補足であり改変だとは捉えていませんので、ご安心ください。

シンヤ - 2006-07-07 22:33

おはずかしい。問題は既にウェブ上で取り上げられ、回避策も出ていました。

適応しておきましたので、以後は正常に受信されるはずです。

トラックバック

PHP :: MIMEタイプ制御ライブラリ - 2006-07-27 04:54

XHTMLのMIMEタイプその他を制御するPHPのライブラリ

PHP化 - 2007-02-02 02:14

Movable TypeのPHP化を一部実行

XHTML1.1手始め - 2007-03-25 01:07

XHTML1.1・・・・・・元々聞いてはいたんですが勉強する機会もなく、とりあえず付け焼き刃の知識を得るためにお世話になったサイトを紹介します。#ブログに...

XHTML1.1と application/xhtml+xml - 2007-05-04 09:47

以前から意味もなく、ただ新しいもの好きというだけで XHTML1.1にしていた当サイトですが、悪評高き Internet Explorerでも閲覧できるよ...

application/xhtml+xml に対応していない場合は text/html を吐くようにした - 2007-09-11 23:28

IE で見えるようにしました。 application/xhtml+xml に対応していない場合は、 text/html で返すように...

i-mode用サイトのXHTMLのContent-Typeの設定(メモ用) - 2009-01-09 18:36

少し前に出会ったエラーで、急ぎで対処したためじゃっかん、うろ覚え。 とりあえず、...

トラックバック URI
http://www.code-404.net/cms/trackback/3
関連記事
検索

情報