404

Archive

PHP の header 関数であれやこれやの続き

Another HTML-Lint に関するエントリー を書いた後に 真琴さんアドバイス を頂いていろいろと試みてみた。のだけれど。

test1.php は header 関数を同一ファイル内(test1.php)に全て書いたもの、test2.php は header 関数を別ファイルに書いて include で読み込んだもの。中身は同じものなので同じ挙動であることを期待していたのだけれど、Mozilla Firefox では test2.php を開いたときに XML パースエラー(外部実体の初めに XML 処理命令がない)と出る結果に(IE ではどちらも text/html として読み込むことが可能)。include で XML ファイルをあれこれするときには何かしら必要なのか、と、また必要部分だけ最低限勉強して使おうとしたしわ寄せが。XML 処理命令というものを調べてみるも スタイルシート関連の文書 が出てくるし。わかりません。

別のファイルに書いて使用しなければいけないわけではないので(管理が面倒ではあるけれど)、このまま実装完了ということで使ってしまっても良いのだけれど、何となく気持ち悪いのでまた先送りということで。あああ。

前の記事 でメディアタイプがマズイだとかは、もしかしたら .htaccess が何か問題だったかなぁと今さらながらに原因が思い浮かぶも、今度は今度で別の問題。

test1.php
<?php 

ob_start();

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

if (eregi("Opera", $ua)) { 
    header ("Content-Type: application/xhtml+xml; charset=UTF-8"); 
} elseif (eregi("Another_HTML-lint", $ua)) { 
    header ("Content-type: application/xhtml+xml; charset=UTF-8"); 
} elseif (ereg("application/xhtml\+xml", $accept)) { 
    header ("Content-Type: application/xhtml+xml; charset=UTF-8"); 
} else { 
    header ("Content-Type: text/html; charset=UTF-8"); 
}

ob_end_flush();

?>
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>test</title>
</head>
<body>
<p>testtesttest</p>
</body>
</html>
test2.php
<?php include_once("header.inc");?>
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>test</title>
</head>
<body>
<p>testtesttest</p>
</body>
</html>
header.inc (test2.php に include させるファイル)
<?php

ob_start();

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

if (eregi("Opera", $ua)) { 
    header ("Content-Type: application/xhtml+xml; charset=UTF-8"); 
} elseif (eregi("Another_HTML-lint", $ua)) { 
    header ("Content-type: application/xhtml+xml; charset=UTF-8"); 
} elseif (ereg("application/xhtml\+xml", $accept)) { 
    header ("Content-Type: application/xhtml+xml; charset=UTF-8"); 
} else { 
    header ("Content-Type: text/html; charset=UTF-8"); 
}

ob_end_flush();

?>

ということで、XML 宣言そのものを省略してみた test3.php はしっかり動いているようですよ、と。charset を Shift_JIS や EUC-JP にする予定はなくて、多分そうすることのメリットもないので UTF-8 で決め打ちなら XML 宣言省略で解決できるよ、と。とりあえず一区切り。

ああ、確かに DOCTYPE 宣言の前(ソースの一番頭)に半角空白入ってるなぁ。何だろうこれ。

あれ、よく考えたら XML 宣言を header.inc に入れてしまえばいいだけなのでは……後で試してみます。

無事解決。DOCTYPE 宣言の前には謎の半角空白は残っているけれど。

Comments

北村

XMLのパースエラーはXML宣言がきっかりファイルの先頭から始まっていない時にも発生します。じっさいtest2.phpをファイルに落としてみると冒頭に空白文字が入っていたので、このせいではないかと思います。
自分とこのサーバでtest2.phpとheader.incをコピペしてみた限りでは問題なく動いてましたが、そちらのソースのどこかで余計な空白が入っていたりとかしないでしょうか。
(或いはいっそのことXML宣言を外すというのも、一つの手かもです)

イソムラ

ローカルファイルには空白がないことを確認しました。念のため一行目(include_once)と二行目(XML 宣言)を同じ行に収めてみたりしましたが、同様のパースエラーが出ました。以前 XREA サーバだったか、XML 宣言の前に改行が入る仕様になっているところがあると聞いたことがあるのですが、それと同じことでしょうかね。

UTF-8 に限定するのであれば(というか多分そうすると思いますが)XML 宣言を省略するのが一番手っ取り早い、という結論になりそうです。
(というか毎回アドバイスどうもありがとうございます)

真琴

こんにちは、一応の解決がなされたようでよかったです。
解決済みの所にまた頭を悩ませてしまうかもしれませんが、「冒頭に空白文字」が生じる件について思い当たることがあるのでコメントを投稿します。
charset が UTF-8 であるということですが、エディタ側での BOM の設定はどうなっていますでしょうか。 UTF-8 の場合は、 BOM を使ってはいけないということはありませんが、逆に使う意味も無いと耳にしたことがあります。私は現在は PHP を使っているために、半ば無意識に EUC-JP を使っていますが、以前 UTF-8 を使用していたころに、このあたりで躓いた覚えがあります。
イソムラさんがお使いのエディタが何であるか分かりませんが、もし BOM 無し UTF-8 ( =UTF-8N ) に対応しているならば、それで保存してもう一度検証してみてください。

イソムラ

エディタでの編集時には UTF-8N で保存しています。
http://www.hi-ho.ne.jp/jun_mi
ura/jmedit.htm

ローカルで PHP を動かして確認してみたのですが、そのときにはファイル先頭に半角空白が挿入されることはないようです。サーバにアップロードした PHP ファイルを FTP から開いてみても半角空白は挿入されていませんでした。
ということは、HTTP 経由で実行したときのみ空白が挿入される、ということになると思うのですが、もうこのあたりはサーバを動かす勉強をしないとわからないような気がしてきてさすがに食傷(?)状態です。

真琴

あ、ローカルでは大丈夫だったのですか……。失礼しました。私も HTTP 関連には明るくないので、これ以上は分かりません。

ただ、北村さんが仰られているとおり、 XML 宣言の前に空白があればパースエラーが起こりますが、 DOCTYPE 宣言の前に空白があってもさして問題はないと思います。( IE 6.0 での DOCTYPE スイッチの問題 ( http://www.remus.dti.ne.jp/~a-satomi/bunsyorou/Doctype-Switch_
situation.html#hosoku-winie6 ) がありますが、これは XML 宣言がある時点で発生するので、この場合は空白文字は問題ないと考えてよいと思います。 )

私が言うべきことではないかもしれませんが、この header 問題はほぼ解決していると思いますので、あとはイソムラさんがどの辺りで妥協の線引きをするかというところだと思います。色々とひっかき回した割には、有効なアドバイスができなくて申し訳ありませんでした。

イソムラ

実装する際にどれを選ぶか、というのも、もう個人的な満足を得るためのレベルのものであるような気もしてます(実際パースエラーを起こすものを除いて)(そもそも application/xhtml+xml での特別なメリット、というものもはっきりしていない段階なので……)。

いろいろと助言ありがとうございました、参考になりました。

もしかするとこれが原因かも: http://orz.cc/blog/2004/02/04-2

イソムラ

情報どうもありがとうございます。
試しに .htaccess に LayoutIgnoreURI * と追加したところ、500 Internal Server Error となりました。
そもそも広告の自動挿入がないサーバなので、別の部分での問題かも知れません。
何なんでしょうかねこれ。

Post a comment

TrackBack

このエントリーへのトラックバック URI
http://www.junkwork.net/movabletype/mt-tb.cgi/19
RSSなど
  • 化け犬.jp 〜技術編
  • 2004年12月10日 11:26
障害報告で、rssが読めないというのがきました。 (FirefoxとHeadline-Reader) トラックバック先にもあるとおりの現象で、不明。 何をしても...

Powered by Movable Type 3.2-ja-2

Last modified : 2006-12-30T00:00:07+09:00