2011-12-25

[apache] mod_rewrite を使って拡張子を省略する

mod_rewriteを使って World Wide Web Consortium (W3C) のサイトのように .html を省略できるようにする方法についての記事です。

w3.org では、たとえば、
http://www.w3.org/TR/html5/introduction
http://www.w3.org/TR/html5/introduction.html
のように.htmlを省略できます。

これを mod_rewrite で実現するためには、以下のように RewriteCond で拡張子なしのリクエストを見極めて、RewriteRuleで /foo/bar -> /foo/bar.html に rewrite すればよいようです。
詳しくは公式ドキュメント mod_rewrite - Apache HTTP Server をご覧ください。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} /[^./]+$
RewriteRule (.*) $1.html

補足
w3.org では mod_rewrite 方式ではなく、Content Negotiation が有効になっていることにより拡張子が省略できるようです。この機能はデフォルトでは有効になっておらず、以下のように有効化します。

Options +Multiviews

共有レンタルサーバーではほとんど使えるところはないかもしれません。デフォルトで有効となっていない理由はおそらくパフォーマンス劣化と非直観的動作なので、よく理解して利用すると良いと思います。