Another HTML-lint と text/html と Movable Type

http://hxxk.jp/2004/09/28/2112

記事データ

投稿者

望月真琴

投稿日時

2004-09-28T21:12+09:00

タグ
概要

Another HTML-lint gateway が頑としてこれに OK サインを出さないと書かれているのを読んで、そこまで気にするエラーじゃないですよ、と思いつつ一応の解決方法をそっと教えてみる次第。Another HTML-lint と text/html と XHTML 1.1 で紹介した判別コードを Movable Type のテンプレートに組み込む方法。

リプライ

4 件のリプライがあります。

記事本文

Movable Type において、 IE にのみ text/html を指定する

Another HTML-lint と text/html と XHTML 1.1 - IE にのみ text/html を指定するで書いたコードを Movable Type のテンプレートに組み込む場合はどうすればいいのか。 これは PHP を用いた UA 判別ですので、 Movable Type を設置しているサーバに PHP がインストールされている必要があります。

テンプレート内に直接記述

判別部分のコードをテンプレートの先頭 ( XML 宣言や DOCTYPE 宣言よりも前 ) に書けばいいので、テンプレートの記述は以下のようになります。 なお、この例は文字コードを EUC-JP とし、 DOCTYPE 宣言を XHTML 1.0 Strict として記述しています。

<?php 

$accept = $_SERVER['HTTP_ACCEPT']; 
$ua = $_SERVER['HTTP_USER_AGENT']; 

if (eregi("Opera", $UA)) { 
  header ("Content-Type: application/xhtml+xml; charset=EUC-JP"); 
}  elseif (eregi("Another_HTML-lint", $_SERVER['HTTP_USER_AGENT'])) { 
  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"); 
} 

?>

<?php echo '<?xml version="1.0" encoding="<$MTPublishCharset$>"?>'."\n"; ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

( 以下省略 )

別ファイルに書き出してテンプレートから include

判別部分のコードの記述は、テンプレートの種類には全く関係がありません。 すなわち、 RSS などを除いた全テンプレートで共通の記述となります。 よって、判別部分のコードのみを記述したファイルをサーバに put しておき、 include で呼び出すようにすれば、ソースの簡略化が図れます。

この例では、判別部分のコードを ua.inc というファイルに記述し、ローカル・サイト・パス 直下に put したとして記述しています。

<?php include_once("<$MTBlogSitePath$>ua.inc");?>
<?php echo '<?xml version="1.0" encoding="<$MTPublishCharset$>"?>'."\n"; ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

( 以下省略 )

実際に生成される XHTML ソース

前項の例を用いたテンプレートで作られた記事の XHTML ソースを見ても、成功しているかどうかは確認できません。 HTTP ヘッダとして Media Type や Charset を送っていますので、実際のソース中には何も現れないからです。

これを確認するためには、 View HTTP Request and Response Header などのサービスを使うと良いでしょう。 ( ただし、このサービスで使われる UA である Web-Sniffer は、今回の判別コードでは考慮されていないため、 text/html として送出されます。 ) また、 Another HTML-lint と text/html と XHTML 1.1 - Another HTML-lint の小技で紹介している方法で確認するのも良いでしょう。

Another HTML-lint に拘りすぎないように

この方法は、 Another HTML-lint に対して、決め打ちで application/xhtml+xml として送出するようにするという方法なので、必ず行わなければならないというものではありません。 XHTML 1.0 を宣言している場合は text/html でも Another HTML-lint と text/html と XHTML 1.1 - XHTML 1.1 において、 text/html で Another HTML-lint による検証を行うで述べたようなエラーは出力されませんし。

XHTML 1.1 を宣言した文書は、 application/xhtml+xml として送出することが Should であると XHTML Media Types では述べられています。 しかし一部の未対応 UA に配慮して、 Should not と自覚しながら text/html として送出する際に、 Another HTML-lint ではエラーとして取り扱われる。 ならば text/html という妥協 ( この表現は適切でないかもしれません ) を行った時点で、このエラーが出力されることは致し方ないものとして捉えても良いのではないでしょうか。

404 : Another HTML-Lint の挙動に困惑にて Another HTML-lint gateway が頑としてこれに OK サインを出さない と書かれているのを読んで、そこまで気にするエラーじゃないですよ、と思いつつ一応の解決方法をそっと教えてみる次第。

トラックバック送信先

リプライ

4 件のリプライが送られています。

2004-09-28T23:30+09:00 - イソムラ

実際にIEとMozilla、Operaで確認したときには問題なく閲覧ができたので気にすることもなかったのですが、ふと思い立ってAHLのチェックにかけてみたところ「減点」と断定されて躍起になったりしていました。別に減点されて困ることもないのですが(実際閲覧できてるわけだし)。 というわけで、お教え頂いたのとほぼ同じ記述(http://bluestar.s32.xrea.com/text/php3.php)でPHPでの振り分けにも手を出したりしていたのですが、サーバで何か設定がしてあるのか(この辺りは全然知識が足りていないので判断しかねるのですが)header関数の記述された行にエラーが出るため実装不可能でした。じゃどうしてエラーが出るのか?というところは本当に基礎知識なく判断できない、ということで一からPHPの勉強をしてみることにしました。 長々と近況報告みたいになってしまいました、スミマセン。

2004-09-30T01:27+09:00 - 真琴

なるほど、てっきり HTTP ヘッダをどう送信するかという時点で躓いているのだと思いました。http://php.s3.to/man/function.header.html によると、「HTTPヘッダが既に送信されていない限り、 header()をコールすることでステータスは常に上書きされます。」とのことなので、これを逆に考えると「HTTPヘッダが既に送信されてると、 header()をコールしてもステータスは上書きされない。」ということになりますね。 headers_sent 関数 ( <a href="http://php.s3.to/man/function.headers-sent.html">http://php.s3.to/man/function.headers-sent.html</a> ) で HTTP ヘッダの送信状態を調べることはできますが、その解説にも「ヘッダーブロックが一旦送信されてしまった後でheader()関数を使って新たなヘッダ行を送信することはできません。」と書いてあるだけで、解決方法は書いてありませんし。 おそらく、イソムラさんも同様のリソースにたどり着いたのではないでしょうか。「対策方法はわかったけれども対応できない」と書かれてあったので……。 私もこのあたりの事は不勉強で、躓いては場当たり的に調べて解決、といった事しか行っていないので、知識が足りていません。お役に立てなくて申し訳ありません。

2004-09-30T02:29+09:00 - 真琴

「header関数の記述された行にエラーが出る」というのは、「Warning: Cannot modify header information - headers already sent by...」といったエラーでしょうか。 某氏に尋ねてみたところ、 ob_start(); 〜 ob_end_flush(); でバッファリングを行うと良いのでは、というアドバイスをいただき、またサンプルコードを書いていだたきました。 バッファリングなし : <a href="http://hxxk.jp/temp/20040930_01.php">http://hxxk.jp/temp/20040930_01.php</a> バッファリングあり : <a href="http://hxxk.jp/temp/20040930_02.php">http://hxxk.jp/temp/20040930_02.php</a> xrea の場合はサーバの設定により (?) 、どちらも 最後の header が出力されますが、同様のコードをイソムラさんのサーバに put して IE でリクエストすると、 20040930_01.php の方はダウンロードになり、 20040930_02.php の方はブラウザ上で表示されるはずです。

2004-10-01T23:09+09:00 - PHP の header 関数であれやこれやの続き < 404

結局まだ先へ進めていない PHP 化。

この記事に対するご意見やご質問、ご感想などありましたらこのフォームに簡潔に記入して下さい。 簡潔に記入できない場合や、関連記事にてご意見をお寄せいただく場合は、ご自身の weblog にて記事を書かれた上で あてにトラックバックとして送信してください。

記入フォーム

補足情報

著作、講演、制作実績など