March 05, 2005

mod_layout と mod_rewrite

昨日の XHTML の話の続きなんですけれども、XML 宣言の有無が問題なら、それをユーザーの環境に応じて動的に対処してやればいいじゃないかと思ったんですよ。

もっと具体的に言うと、私の考えた方法は次のようなもの。

まず、アクセスしてきた UAHTTP_ACCEPT を見るんですよ。そしてそこに application/xhtml+xml があれば、その UA には Content-Type: application/xhtml+xml; charset=Shift_JIS のヘッダと <?xml version="1.0" encoding="Shift_JIS"?> の XML 宣言を付加した文書を返してやる。これがない、つまり IE 6 を含む application/xhtml+xml を受け付けない UA に対しては、Content-Type: text/html; charset=Shift_JIS のヘッダと XML 宣言のない文書を返してやるんです。

では実際に、この処理を実現するにはどうすればいいか。ざっと調べたところ、Apache のモジュール mod_rewrite を利用して HTTP_ACCEPT の値に応じた Content-Type を出力する方法は見つかったのですが、文書側の加工なしで動的に XML 宣言の付加を制御する方法は見あたりませんでした。

SSIPHP を使えば簡単に文書内容を動的に変えられるのですが、そういった処理を通常の文書中に含めるのはできれば避けたい。

そこで思いついたのが、広告自動挿入に使われる Apache の mod_layout モジュールを利用して、サーバー レベルで UA に応じた XHTML を生成する方法。さっそく .htaccess ファイルにその処理を記述して試してみたのですが、残念ながらうまくいきませんでした。

ならばどうするかと考え思いついたのが、前出の mod_rewrite と CGI の併用です。かなり無茶な方法なのですが、概略を説明するとこんな感じ。

  1. まず、XHTML 文書を XML 宣言を記述せず作成する。
  2. HTTP_ACCEPT に application/xhtml+xml を含む UA の場合は、mod_rewrite を有効にする処理を .htaccess に追加。
  3. mod_rewrite は HTTP_REQUEST_FILENAME をパラメータとして CGI を呼び出す。
  4. 呼び出される CGI は Content-Type: application/xhtml+xml のヘッダと、パラメータに指定されたファイルに XML 宣言を付加した文書を出力。もちろん CGI は UA からは普通の文書に見えるよう Last-Modified を出力する。

なんだかこれだけだとわかりづらいですが、つまり IE などの application/xhtml+xml を受け付けないブラウザの場合は、あらかじめ作成した XML 宣言のない XHTML をそのまま出力するわけです。それ以外の場合に初めて CGI を通して出力を加工する…と。これを行えば、私のサイトにおける XHTML の互換性問題は一発解決ですよ。もうすばらしい。感激のあまり体中から何かが出そうですよ。で、自画自賛したらとりあえず口からあくびが出ました。寝不足なので。

さて、今後の方針が決まったので、これから XML 宣言のない XHTML をばりばり作ることにします。よーし、ガンガルぞ。

TrackBacks

  • トラックバック内容 (excerpt) には必ずひらがなを含めてください。入っていない場合は拒否します。
  • このエントリの URI を含まない (リンクしていない) トラックバック元からは受信しません。

Comments

HTTP_ACCEPTを調べてみました

こんにちは。
私はいままでHTTP_ACCEPTを意識したことがありませんでした。たいへん勉強になります。
で、私の環境でHTTP_ACCEPTがどうなるかいくつか確かめてみました。

MacOS 9.2
 IE 4.5: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/xbm, image/x-jg, */*
 IE 5.1.7: */*

MacOSX 10.3.8
 IE 5.2.3: */*
 Safari 1.2.4: */*
 Firefox 1.0: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

VirtualPC7+WinMe
 IE 6.0: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

「application/xhtml+xml」の有無だけでは問題がありそうな気がします。

by ワトソン at Mar 10, 2005 20:48:03

いや

お調べいただいた情報ですと、各 OS とも IE は application/xhtml+xml を受け付けないため、text/html の MIME で XML 宣言なしの文書がサーブされることになります。これは期待通りの結果です。Firefox や Opera は application/xhtml+xml を受け付け、なおかつその場合は XHTML を XML として「厳密に」レンダリングするので、application/xhtml+xml の MIME で XML 宣言つきの文書をサーブします。これも期待通りの結果です。

問題なのは Safari なのですが、調べたところ application/xhtml+xml で XHTML を受け取るとダウンロードしようとしてしまうようで (要するに IE 同様未対応)、実際に HTTP_ACCEPT も「*/*」だけ (正規表現にマッチする「文字列」として application/xhtml+xml を含まない) ですから、この場合は text/html で XML 宣言のない XHTML がサーブされることになります。

Safari に関しては手元に検証環境がなく、情報を探しても「標準」と「互換」の切り替えを行っているのか、行っているならばその条件と挙動の違いは何なのかがいまいちはっきりしないので (単に私の検索能力不足かも…)、どのように対処するのが理想的なのかわかりません。ですが、IE の場合と同様に処理しても「ページを表示する」という最低条件は満たす (いきなりダウンロードしようとすることはない) ので、特に振り分け条件としては問題ないと思います。

いずれにせよ Mac 環境の情報は当方極端に少ないので、今回の情報は非常に参考になりました。とりあえず全ページの XHTML 化が完了したら (現在 HTML 論理構造やモバイル対応も考え XHTML 化と同時に CSS も再構築中)、この方法を試してみたいと思っています。

by MatsuYan at Mar 13, 2005 12:11:24

いろいろ試してみました

SafariのHTTP_ACCEPTは明らかに手抜きで意味をなしていません。
でも、実際に試すとSafariはほぼFirefoxと同程度にxhtmlに対応しているようです。
興味深かったので、テストプログラムを作成し、結果を表にしてみました。
http://wato.skr.jp/xtest/test.html

by ワトソン at Mar 15, 2005 03:51:27

うわ!

リンク先の URI をクリックして、一瞬なんじゃこりゃ? と思い、次に思わずため息が出てしまいました。よくぞここまで…というか、その労力を惜しまない姿勢には心から脱帽です。

この結果を見る限り、HTTP_ACCEPT に application/xhtml+xml を含まなくとも、UA が Safari であれば Gecko 系や Opera 同様に処理しても問題なさそうですね…と思ったのですが、さらに調べると Safari も初期のベータ版と現在のバージョンでは appplication/xhtml+xml に対する挙動は異なるようです。

http://www.w3.org/People/mimasa/test/xhtml/media-types/results (ページ下の表)

Safari の場合はさらにバージョンも見るという方法も考えたのですが、完全にブラウザ個別に対応していたのではきりがなくなってしまいます。ウェブログや掲示板の出力は各 CGI で処理しなければならないため、そうするとその振り分けも煩雑になりサーバー負荷も増えますし…。

「どの UA であっても、とりあえず標準準拠モードで表示だけはできる」という点では、やはり現状 HTTP_ACCEPT に application/xhtml+xml を含むか否かで処理するのが無難 (ベストではないが) という気がします。

by MatsuYan at Mar 17, 2005 23:43:16

Safariのバージョン

過去の日記にコメントを重ねるのって、なんだか見過ごしそうですが(笑)、とりあえず追加報告を。

>その労力を惜しまない姿勢に
まあ、趣味みたいなものですから。
XHTMLを実際に試したのは初めてでしたし、text/html以外を試したの初めてです。
とっても勉強になりました。
にも関わらず、私自身はHTML4.01 transitionalですましています(笑)。当分はこの方針です。
まあ、もっとも現実的かな、ということで・・・(でも、一応WinIE6.0では標準モードになるようにしています)。

SafariのバージョンはOSのバージョンに依存しています。
MacOS X 10.2.x : Safari 1.0.x(最新1.0.3)
MacOS X 10.3.x : Safari 1.2.x(最新1.2.4)
10.2.xのユーザーは、お金を出して買わないと10.3.xにVerUpできませんので、Safari 1.0.xを使い続けている人はいるでしょう。
私のMacの予備のパーティションに10.2.8が(まだ消去せずに)残っていたので、切り替えてSafari1.0.3を試してみました。
その結果、前回の私のテストプログラムに限っては、Safari1.0.3とSafari1.2.4に動作の差はありませんでした。
1.0.3より古いVerでは試せませんでしたが、使用している人は少ないと思います。

ついで情報。
ご紹介されたリンク先の表にiCabというMac用ブラウザがありますが、iCabはHTMLの解釈にかなり癖があり、CSSのサポートはせいぜいCSS1.0程度で、やはり癖があります。バグも多い。私も以前はチェック対象に入れていましたが、かなり苦労が多く、ユーザーも少ないということで、もう無視することにしています。

by ワトソン at Mar 19, 2005 01:52:51

さらに忘れた頃にコメントしてみたり

どうやら Safari 1.2 以降であればすべての XML タイプを解釈するようなので、この場合には可能な範囲で application/xhtml+xml を返すように検討してみたいと思います。本当は Safari が HTTP_ACCEPT に最初から application/xhtml+xml を含めてくれたら話は早いんですけどね。

なんだか Mac 版の Opera も application/xhtml+xml を表示できるにも関わらず、HTTP_ACCEPT にそれを含んでいないらしい情報を得たので、さてどうしよう…もう考えたくないです。

私も iCab の存在は知っているのですが、調べても得られる情報が少ないので見なかったことにしてしまっています。幸いなことに、今のところ当サイトのアクセスに使用している方は見たことがないので。

by MatsuYan at Mar 26, 2005 00:21:15

投稿フォーム

  • コメント以外の入力は任意です。
  • コメント文中には必ずひらがなを含めてください。入っていない場合は拒否します。
  • メール アドレスは公開されませんが、URI を入力した場合は名前がリンクとなります。なお、いずれもコメント欄への入力についてはリンクされます。
  • このページの URI をリファラとして送信しない UA からの投稿は受け付けません。