閑古鳥 -> 呟き -> Content-Typeを振り分けるいくつかの方法

Content-Typeを振り分けるいくつかの方法

ACCEPT ヘッダ を見て振り分ける

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) を修正するだけで済むので。

UserAgent 名を見て振り分ける

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 に対応

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 追記