Minase's Blog - FYA

mod_rewrite MultiViews

投稿日:

mod_rewriteを利用していたら問題が発生。

問題
「http://ドメイン/sitemap/(以下sitemap/)」を参照しようとして404エラーを受ける。問題は「http://ドメイン/sitemap.拡張子(以下sitemap.拡張子)」が存在するからでした。FYAのホームページサーバー(Apache)ではデフォルトでオプション「MultiViews」が有効だからです。

「MultiViews」の機能は「thhp://ドメイン/sample」という拡張子が表記されていないリクエストが場合、sampleを探しsampleがない場合は「sample.拡張子」を探して表示します。sample.htmlを設置し、sampleとリクエストした場合は、sampleというファイルが無ければ自動的にsample.htmlを表示する機能です。

今回の問題は「sitemap/」とリクエストした時、mod_rewriteが機能するより先にMultiViewsが機能して「sitemap.拡張子/」が参照されてしまい、存在しないので404エラーになります。この時、「sitemap.拡張子」が設置されていなければ問題なく動作するのですが、どうしても「sitemap.拡張子」というファイルを設置したいので撤去or別ディレクトリへ移動はしたくありませんでした。

解決方法
解決方法は二点あります。

  • mod_rewriteで定義している「名前.拡張子」のファイルを別ディレクトリなどへ移動する
  • MultiViewsを無効にする

最初やむなくファイルを移動させることで解決しました。移動させたとしてもmod_rewriteを使って元の位置に設置されているかのように見せかけていました。ですが、管理部分から諦めないで考えていたところ、MultiViewsとの関係性に気づいた訳です。そこでMultiViewsを無効にしてみたところ、狙ったとおりの動作を得られました。

まとめ
mod_rewriteによる移動は内部的な問題であり、管理上の都合が発生する。なんだか腑に落ちない気持ちを抱きます(微笑)

mod_rewriteの設定例(.htaccessへの記述の場合)

RewriteEngine On

RewriteBase /

RewriteRule ^sitemap/$ dir1/sitemap\.html [L]

RewriteRule ^(sitemap\.xml|sitemap)$ dir2/sitemap\.xml [L]

MultiViewsを無効にすることはそのディレクトリ層で、その機能を使えないことを意味します。配下のディレクトリは新たにMultiViewsを有効にすることで機能します。MultiViews機能を使っていなければ特に問題はありません。

MultiViewsの設定例(.htaccessへの記述の場合)

# MultiViews無効

Options -MultiViews

# MultiViews有効

Options +MultiViews