AcceptヘッダやUAを見てContent-Typeを振り分ける†
- ページ: BugTrack
- 投稿者: justitia
- 優先順位: 低
- 状態: 保留
- カテゴリー: 本体新機能
- 投稿日: 2004-11-26 (金) 13:59:27
- バージョン: 1.4.x
メッセージ†
Another HTML-LintにWikiから出力されたHTMLソースを放り込むと怒られてしまいます。
そこでpukiwiki.skin.phpを次のように書き換えてみます
header('Content-Type: application/xhtml+xml ; charset=' . CONTENT_CHARSET);
これならば怒られなくなるけれども、IEなど一部のブラウザでは表示されなくなります。そこで次のように書き換えます
$accept = $_SERVER['HTTP_ACCEPT'];
$ua = $_SERVER['HTTP_USER_AGENT'];
if (eregi("Opera", $UA)) {
header ('Content-Type: application/xhtml+xml; charset=' . CONTENT_CHARSET);
} elseif (ereg("application/xhtml\+xml",$accept)) {
header ('Content-Type: application/xhtml+xml; charset=' . CONTENT_CHARSET);
} else {
header ('Content-Type: text/html; charset=' . CONTENT_CHARSET);
}
これなら、問題ない・・・はずです。
もしよければ使って下さい
- Operaだけ明示的に分けているのは何故? --
- おそらく、Opera は HTTP_ACCEPT に application/xhtml+xml を出さないからでは? -- みこ
- ただ、Operaも含めてUSER_AGENTによる例外は作るべきではないとおもいますけどね (^^; 受け入れられないといってるんだから・・・ -- みこ
- 余談ですが、another-lint も HTTP_ACCEPT に application/xhtml+xml が含まれていなかったような覚えが・・・ (^^;(記憶違いならごめんなさい (^^;) -- みこ
- お知らせありがとうございます :) Another HTML-Lint のその解説の最後に「しかし、そもそも application/xhtml+xml では、<meta http-equiv> を記述すべきではありません。」とも書いてありますね。そうなのであればスキンから <meta http-equiv> を取り除くことや、その影響についても考えて作業しないといけなそうです。怒られなくなるようにしよう、というよりも、正しいのはどうなのだろうか、という視点でもう少し掘り下げる必要がありそうですね。ご意見をお待ちしております -- henoheno
- けど実質今は<meta http-equiv>があるからこそIEでも何とか表示できているのであって、削除したらそれこそIE門前払いになりかねないと思います --
- ああ、「正しい」というのは仕様に対する厳格さではなくて、(スマートで)現実的な解かどうかということでお願いします :) -- henoheno
- できるならば.htaccessで全部メタ情報を提供するのが一番と思います。<meta http-equiv>はあくまでもこの手段が使えない場合の代替措置だと、私は思います --
- そうそう、Windows は application/xhtml+xml をわたすプロトコルや拡張子が未だにないんですよね (^^; -- みこ
- わたしの中での現実的な解は ブラウザがW3C標準モードになってさえくれれば、無理に application/xhtml+xml でなく text/html でもいいのでは?という感じです。(そうするとほぼ現状でいいのでは?ってことなんですけどね。) -- みこ
- ただ、HTTP(プロトコル) からみての本来は RFC2616(HTTP/1.1) ではリソースを最適にあらわせるのならば、再度サーバにリクエストしておこなう・・・ということになっています。そのための再リクエストやタイプの認識を補助するのがのが Accept になるので、Accept で application/xhtml+xml (とapplication/xml)があるならば、それを返してあげてもいいのではないかな*1と・・・ -- みこ
- ふむふむ。ブラウザが該当の Accept を返してくる (受け入れオッケーですよ) ときにそうする (Content-Typeをセットし、metaを取り外す) のが良さそうですね。 -- henoheno
- 旧PukiWiki.org の対応 -- merlin
header('Cache-control: no-cache');
header('Pragma: no-cache');
if (ereg("(Gecko|Opera\/7|Another_HTML-lint)",HTTP_USER_AGENT) == FALSE)
{
header('Content-Type: text/html; charset='.mb_http_output());
} else {
header('Content-Type: application/xhtml+xml; charset='.mb_http_output());
}
if (ereg("MSIE (3|4|5|6)", HTTP_USER_AGENT) == FALSE) {
echo '<?xml version="1.0" encoding="'.mb_http_output().'"?>'."\n";
}
......
<head>
<?php if (ereg("(Gecko|Opera\/7|Another_HTML-lint)",HTTP_USER_AGENT) == FALSE)
{ ?>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=<?php echo mb_http_output()?>" />
<?php } ?>
<?php if (ereg("(Another_HTML-lint)",HTTP_USER_AGENT) == FALSE)
{ ?>
<meta http-equiv="content-style-type" content="text/css" />
<?php } ?>
......
- こんな風にするのかな? -- merlin
http://fumika.jp/nikki/2004/04/mod_rewrite
http://altba.com/bakera/hatomaru.aspx/ebi/topic/1234
http://www.nurs.or.jp/~b3/test/mediatype/
- 参考資料としては HTMLおよびXHTMLに関するFAQ (和訳) かな・・・このなかに、ちょっと興味深い記事も・・・ -- みこ
IE6.0SP2WindowsのIE限定だけど、トリックを使ってXHTML1.1表示できちゃった・・・ (^^; -- みこ
- merlinさん、みこさん資料をありがとうございます。この対処は実務的にどうこうというよりも、丁寧であるかどうかという問題のようですね。 -- henoheno
- そそ。なおかつまだ問題も多いし、PukiWikiはスキンだけで対応できるので「ちょっと便利に」ぐらいの程度かと。。。 -- みこ
- 関連: BugTrack2/16 --