application/xhtml+xml と mod_rewrite

2004-4-25 23:10
このエントリーをはてなブックマークに追加

以前、『XHTML1.1の MIME タイプ指定』にて、XHTML 文書の Mime Type について書きました。本来 application/xhtml+xml とすべきですが、Internet Explorer が未対応なので現実的には text/html を出力するしかありません。その後、XSLT を使うという手法も教えて頂いたのですが、IE には対応できますが、実は Google も XML を解釈しないため、Google にインデックスされなくなってしまいます。

そこで、Apache の機能で、UA に応じて MIME タイプを変えようと思っていたのですが、なかなかいい解決策がありませんでした。しかし、『「application/xhtml+xml」@水無月ばけらのえび日記』にて、「Accept: に application/xhtml+xml を含む場合は application/xhtml+xml で応答する」という方法が提示されていたので、それを Apache の mod_rewrite モジュールを利用して設定しました。

基本的には、httpd.conf で、次の通り設定します。

  AddType "text/html; charset=utf-8" .html

  RewriteEngine On
  RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
  RewriteCond %{REQUEST_FILENAME} \.html
  RewriteRule .* - "[T=application/xhtml+xml; charset=utf-8]"

ところが、コンテント・ネゴシエーション (Content Negotiation) を利用していると、うまくいきません。拡張子を含めずに URI を指定した場合は、text/html のままなのです。
これは、REQUEST_FILENAME に LA-F: を付加することで解決しました。

  AddType "text/html; charset=utf-8" .html

  RewriteEngine On
  RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
  RewriteCond %{LA-F:REQUEST_FILENAME} \.html
  RewriteRule .* - "[T=application/xhtml+xml; charset=utf-8]"

しかし、まだ問題がありまするそれは、ディレクトリインデックスの場合も、application/xhtml+xml にならないことです。いろいろ調べたのですが、似た機能を持つ mod_dir (DirectoryIndex) と mod_rewrite を併用することに無理がありそうな気がします。

この問題に関しては、重度偏在型散逸文書構造: XHTML ワールドへようこそにて、mod_rewrite で / を index.html にマッピングするという解決策が提示されていました。あまり美しくないのですが、こうするしかないのかなあ。

ちなみに、この設定でも Another HTML-lint には、HTTPレスポンスヘッダに指定されているメディアタイプ text/html は XHTML1.1 には指定しないようにしましょう。と怒られてしまいます。HTML-lint は、Accept に application/xhtml+xml を入れてないのにチェックするようです。

  • ブックマーク : アクセス: 14,385回
  • カテゴリー : Apache
  • キーワード :

2件のコメント

  1. (thumbnail)

    >そこで、Apache の機能で、UI に応じて MIME タイプを変えようと思っていたのですが、

    UIではなくUAですよね。abbrのtitle属性はちゃんと”User Agent”になってますけど。

    >基本的には、httpd.conf で、次の通り設定します。

    .htaccessでもいけるようです。コンテントネゴシエーション・ディレクトリへのアクセスにも対応できるように改造してみました。私の場合はこんな具合になります:
    <FilesMatch “\.(html|shtml)$”>
    RewriteEngine On
    RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
    RewriteRule .* – “[T=application/xhtml+xml;charset=Shift_JIS]”
    </FilesMatch>

    Netscape・Operaでapplication/xhtml+xmlになることを確認しましたが、IEでMime Typeを表示させる方法がわからなかったので、デフォルトでtext/htmlかどうかは知りません。

    Comment by かんな2005-03-25 17:44

  2. (thumbnail)

    ご指摘ありがとうこざいます。UIは間違いです。UAに訂正しました。

    なるほど、FileMatch は試していませんでした。また時間があるときにやってみます。貴重なご助言ありがとうございました。

    Comment by fumika2005-03-25 23:06

現在、コメントフォームは閉鎖中です。

23 queries. HTML convert time: 0.436 sec. Powered by WordPress. Valid XHTML
Copyright © 2003-2013 @ futuremix.org ログイン