閑古鳥 -> 呟き -> Content-Typeを振り分けるいくつかの方法
UAの吐き出す ACCEPT ヘッダには、その UA の対応している MIME タイプが列挙されているので、これに application/xhtml+xml という文字列があれば、 Content-Type にこれを指定して、それ以外の UA には text/html などを出力する、という方法が簡単でいいと思います。 コードを書いてみます。
$accept = $_SERVER['HTTP_ACCEPT'];
if (eregi("application/xhtml\+xml",$accept)) {
header ("Content-Type: application/xhtml+xml; charset=EUC-JP");
} else {
header ("Content-Type: text/html; charset=EUC-JP");
}
一行目で UA から ACCEPT を取得して、次の if 文で、この中に application/xhtml+xml があるかを調べて、あった場合、 header で application/xhtml+xml を Content-Type として出力させています。 もし無ければ、 text/html を出力します。
これを xhtml 文書を元にしている (?) 各 php ファイルの先頭に置けば、 UA によって Content-Type を振り分けることができます。
と言っても全てのファイルにこんなコードを置くのも面倒なので、上記のソースコードを外の PHP スクリプト、例えば header.inc というファイルの中に書いておいて、他のファイルの先頭には <?php include_once("header.inc"); ?> などと書いた方が楽だと思います。ヘッダに他のものを入れたい場合もこのファイル (header.inc) を修正するだけで済むので。
UA によっては対応している MIME タイプ全てを出力しないものがあり、こういった UA にもちゃんとした Content-Type を出力してやるには、 UA 名を見て一々振り分けてやらないといけません。
例えば Opera というブラウザは、 application/xhtml+xml を読めるそうですが、 ACCEPT ヘッダには application/xhtml+xml とは書かれていません。 Opera にも application/xhtml+xml として読ませたい場合は、先のコードを少し書き換えて次のようにしてやります。
$accept = $_SERVER['HTTP_ACCEPT'];
$ua = $_SERVER['HTTP_USER_AGENT'];
if (eregi("Opera", $UA)) {
header ("Content-Type: application/xhtml+xml; charset=EUC-JP");
} elseif (ereg("application/xhtml\+xml",$accept)) {
header ("Content-Type: application/xhtml+xml; charset=EUC-JP");
} else {
header ("Content-Type: text/html; charset=EUC-JP");
}
これで、 Opera でも application/xhtml+xml として xhtml 文書を読ませることができます。 他にも Opera と似たような UA があれば、前述のソースコードに書き加えていけばいいと思います。面倒ですが。
Another HTML-lint が xhtml1.1 準拠の文書をチェックする際に、 Content-Type も見るようになり、しかし HTML-lint の Accept ヘッダには application/xhtml+xml が含まれていないよー、という Opera と同じパターンにはまっていたため、上記のスクリプトを HTML-lint にも対応できるようにしてみました。
if (eregi("Another_HTML-lint", $_SERVER['HTTP_USER_AGENT']))
header ("Content-type: application/xhtml+xml; charset=EUC-JP");
上記のコードを加えることで、 HTML-lint がチェックする際にも application/xhtml+xml として読ませることができます。
2004-02-05 追記