.htaccessを使用してURLから拡張子.htmlを消す方法

Pocket

最近はMovable TypeからWordPressへの移行が盛んですが、サーバリソースを大きく削りがちなWordPressからMovable Typeへの移行を考えている方もいらっしゃると思います。そこで問題になるのが、WordPressのパーマリンクの設定を、Movable Typeにどう反映させるかです。動的(PHP)から静的(HTML)コンテンツへ移行する訳ですが、一番の問題点は拡張子を隠す方法だと思います。

また、最初は静的コンテンツ(HTML)でWEBサイトを構築したが、ゆくゆくは動的コンテンツ(PHP,Java,cgiなど)に移行したいと考えるケースもあるでしょう。そのような場合、拡張性を考えて最初から拡張子無しのURL構成を採用しておくのが無難だと考えます。

そこで、今回は.htmlの拡張子を隠す.htaccessの設定方法をご紹介したいと思います。

スポンサードリンク


拡張子を隠す設定

もしお使いのApacheサーバーがコンテントネゴシエーション(MultiViews)を許可している場合はこれを使った方が設定は楽です。
Options +MultiViews
MultiviewsMatch Handlers

楽なのですが、サーバーに高負荷が掛かりやすいため、レンタルサーバーでは許可していない業者が多くなっています。
例えば、さくらのレンタルサーバーでは許可されていません。

コンテントネゴシエーション(MultiViews)はテキストだけではなく、画像などのメディアファイルまでも制御の対象としているので高負荷が掛かってしまうのです。
この辺は下記で少し触れたいと思います。


さて。そもそものお話し。
URL永続化の観点からは有用な機能なのですが、サーバーへの負荷を減らしたいから静的コンテンツに移行したいというケースだと本末転倒です。

なにせ、レンタルサーバ会社が使用を制限するくらいにはハイコストなのですから


そこで、コンテントネゴシエーション(MultiViews)より負荷の掛からない方法がRewriteを用いた方法になります。

MultiViewsを許可していないレンタルサーバでも、Rewriteまで許可していないというケースは自分の知り限りありません。機能を極端に制限している(月100円くらいの)低価格のプランは除きますが。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.html [NC,L]
</IfModule>

リクエストされたURLがディレクトリ(末尾がスラッシュ)以外の場合かつ、「.(ドット)」から始まる1文字以上の文字列=拡張子が無かった場合、末尾に.htmlをつけてHTMLとしてリダイレクトするというものです。ブラウザのURL欄には拡張子無しのURLが表示され.htmlは表示されません。


.htmlの箇所を変更することで、.phpや.cgiにも応用することができます

個人利用ではあまり無いでしょうが、Java Servletの場合はTomcat等のサーバコンテキストで設定できるので.htaccessの設定は不要です。

注意点

上記の設定は拡張子を隠しただけで、依然として.html付きのURLでもアクセス可能な状態です。
つまり、1つのコンテンツに2つのURLが存在することになります。
例:「http://domain.com/hoge」と「http://domain.com/hoge.html」

この2つのURLが検索エンジンに登録されてしまうと「重複したコンテンツ」としてペナルティの対象となってしまいます。サイトマップや内部リンクでは一貫して「拡張子無し」のURLで統一する必要があることに注意してください。

上記の例ですと、hoge.htmlというURLではインデックスさせないようにするということです。

永続的なURLについて

クールなURIは変わらないで指摘されている通り、自分もURLの永続化については肯定的な考えを持っています。

上記URLの内容を要約すると、大体以下のようになります。

  • WEBコンテンツがどんな形(html,cgi,php,java…etc)で配信されていても、そんなことは見る側にとっては関係ない
  • 仮にWEB側の都合で仕様が変更されたとしても(拡張子が変わったとしても)、ビジターの利便性を第一に考え、同じURLで同じコンテンツが表示されるべきである
  • 以上の要件を満たす簡単な方法は、Apacheサーバのコンテントネゴシエーション機能を使うこと

上記の文献は今から10年以上前のものですが、先見性のある先人ですね。というか、怒りに任せて書いた文章っぽいですが(笑)


個人的に思うのは、デベロッパーの立場から考えると保守性・拡張性の高さから拡張子はつけない方が良い、ビジターやブロガーの立場から考えてもURLが変わる度に「404 Not Found」でリンクを貼りなおさなければならないのは苦なのでURLは変わらないでほしいということです。

「301リダイレクト」なら問題ないように思えますが、それは永続的に301リダイレクトの設定を有効にしている場合に限ります。検索エンジンに新URLが浸透したタイミングで301リダイレクトの設定を削除するサイトがありますが、これはサーチエンジンのことしか考えておらず、手動でリンクを張っていたりブックマーク登録している人たちに取っては不便なことです。

コンテントネゴシエーションについて

詳細はApacheのドキュメントを参照してください。
MultiViewsの箇所について少し引用します。

Multiviews
MultiViews はディレクトリ毎のオプションで、 httpd.confファイルの , , セクション中や、(AllowOverride が適切な値に 設定されていると) .htaccess ファイルで Options ディレクティブによって設定することができます。 Options All は MultiViews をセットしないことに注意してください。明示的に その名前を書く必要があります。

MultiViews の効果は以下のようになります: サーバが /some/dir/foo へのリクエストを受け取り、/some/dir で MultiViews が有効であって、 /some/dir/foo が存在しない場合、 サーバはディレクトリを読んで foo.* にあてはまる全てのファイルを探し、 事実上それらのファイルをマップするタイプマップを作ります。 そのとき、メディアタイプとコンテントエンコーディングは、そのファイル名を 直接指定したときと同じものが割り当てられます。 それからクライアントの要求に一番合うものを選びます。

サーバがディレクトリの索引を作ろうとしている場合、 MultiViews は DirectoryIndex ディレクティブで指定されたファイルを探す過程にも 適用されます。設定ファイルに

DirectoryIndex index
が書かれていて、index.html と index.html3 が 両方存在していると、サーバはその中からどちらかを適当に選びます。 もしその両方が存在せずに index.cgi が存在していると、 サーバはそれを実行します。

もしディレクトリを読んでいる際に、 文字セット、コンテントタイプ、言語、エンコーディングを 指定するための mod_mime で認識できる拡張子を持たないファイルが見つかると、結果は MultiViewsMatch ディレクティブの設定に依存します。このディレクティブは ハンドラ、フィルタ、他のファイル拡張子タイプのどれが MultiViews ネゴシエーションで使用できるかを決定します。



読んでいただくとRewriteよりも多くの処理を行っていることが分かると思います。
つまるところ重いのです。

高性能なレンタルサーバやVPSをお使いの方は使ってみる価値があると思います。
ぶっちゃけますと自分も使いたいです


でも貧乏性なので安いサーバしか借りられないのですよ…とほほ。

お役に立てましたか?

ブックマークをどうぞ!

スポンサード リンク

コメントを残す