特に目新しいお話ではないんですが、SSI の条件式を使用して、ブラウザ別にあれこれする方法について書き留めておこうと思います。
今回は、XHTML で文書を公開する時に面倒な問題である、IE6 において、XML 宣言等、DOCTYPE 宣言以外を文書先頭に書いた時に、DOCTYPE スイッチによってレンダリングモードが過去互換になってしまうバグへの対応を SSI で何とかしてみようというのを主に取り上げてみたいと思います。
Apache HTTP Server の現行バージョンでは、SSI で条件式が使用できます。なので、
<!--#if expr='"$DOCUMENT_URI" = "/foo/file.html"' --> in foo <!--#elif expr='"$DOCUMENT_URI" = "/bar/file.html"' --> in bar <!--#else --> in neither <!--#endif -->
などとすれば、特定の条件で表示させたりといったことが可能です。上記の例では 「=」 を使用した構文になっていますが、これは 「等しい」 という条件を指定するもの。その他にも、等しくない時にマッチさせる、
- string1 != string2
とか、string1 と string2 を比較する下記のような構文、
- string1 < string2
- string1 <= string2
- string1 > string2
- string1 >= string2
なども使えます。さらに、「/.../」 形式で値を指定することで、正規表現によるマッチングなんかも可能です。より詳しくは文末の関連リンクをご参照ください。
それでは本題。XML 宣言でレンダリングモードが変わってしまうモダンブラウザは IE6 だけですので、単純にユーザーエージェントが IE6 だったときにマッチさせれば問題ないでしょう。よって、
<!--#if expr="$HTTP_USER_AGENT != /compatible; MSIE 6/" --> <?xml version="1.0" encoding="utf-8"?> <!--#endif --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
こんな風に書けば OK。・・・と思いがちなのですが、これで実行すると、IE6 で XML 宣言は消えるものの、先頭に改行が残ってしまいます。IE6 の場合は、文書型宣言の前に、改行や空白文字が入っただけでも過去互換モードに切り替わってしまうので、これでは意味なし。じゃあってことで、SSI 文から文書型宣言まで全部改行なしで書くと、IE6 以外で XML 宣言と文書型宣言が 1行になっちゃって気持ち悪い。
[5月3日 追記]
上記削除部分、うそつきました。ごめんなさい。ということで、下記は XML 宣言がない時に先頭に空白行があるのが気持ち悪い人用です。
ということで、こうします。
<!--#if expr="$HTTP_USER_AGENT != /compatible; MSIE 6/" --><!--#include virtual="/xml.inc"--><!--#endif --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
条件式で外部ファイルを読み込んでやると。SSI 文から文書型宣言までは改行なしで書いてくださいね。そして、読み込む外部ファイルに、
<?xml version="1.0" encoding="utf-8"?>
XML 宣言を書きますが、そこで、XML 宣言後に改行を入れておきます。これで、IE6 では文書型宣言が 1行目に、それ以外のブラウザでは、XML 宣言が改行付きで 1行目に表示されるはず。
PHP とか、perl とか、プログラムを使えば同じことはできるんですけど、SSI ならもっとお手軽ってことで、SSI が使用できる環境で、どうしても IE6 だけXML 宣言を出したくないって人にはいいかも。ちなみに、こんな解説している当サイトでは使用してません。XML 宣言を書いた上で、IE6 は過去互換モードでも何とかなるように CSS を書いています。