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
- Newer: Movable Type アップデート(3.3→4.0)
- Older: Template FYA テンプレート追加
Comments:4
- 糸 2007年9月15日 01:35
んー。
本来のユーザーの意図から外れるので、MultiViews自体を切ってしまった方がいいんじゃないかと…というのは、
http://hoge.fya.jp/sample
がリクエストされたとき、
ユーザーの意図としては
/sample/
を参照しており、期待される動作は
1. /sample/index.html
2. .htm
3. .shtml
3. .php
4. .cgi
あたりになってくるはずなのです。
ただし、本当に/sampleがほしい可能性はあるので、
動作としては
1. /sample
2. /sampel/index.*
となるべきではないかと。きっと/sample.htmlを応答するのは余計なお世話ではないのかなあ、と思うのですが…いかがでしょうか?
- 水瀬 2007年9月18日 07:49
以下はロールバック以前のコメントです。
水瀬 : 2007年9月15日 05:30
>/sample
FYAでは「/sample」で終わるリクエストがあった場合、デフォルトで以下のように動作します。1. sample
2. sample.拡張子
3. sample/ ※
※ 最終的にディレクトリが参照され、インデックスファイルが読み込まれます。>応答するのは余計なお世話ではないのかな
上記で明記した動作は「ファイルが存在しない」時の動作ですので、問題は無いと思われます。
私の理解と糸さんの意図が上手く伝わっていなかったとしたらお詫びします。補足
「/sample」で終わるリクエストを受けた際、「sample」を返すがファイルが無ければ「sample.拡張子」を返しますが更にファイルが無ければ「sample/」という感じでスラッシュが補填されディレクトリ指定になり、続いて内部的(URLには表示されない)に「sample/index.html(正確にはindex.htmlに留まらずインデックスファイルを返す)」を参照する。
結果、全てにヒットしなければ404 or 403が、ヒットすればそれが返されています。糸 : 2007年9月15日 21:17
ほへー。勘違いしていたようです。お手数かけました(ぺこり)- ジョージ 2010年11月29日 12:05
はじめまして。
自分はsitemap.xmlとsitemapスラッグの競合で悩んでいるので、水瀬さんのブログが大変参考になります。
ありがとうございます。一つ質問があるのですが、sitemap.xmlとsitemapスラッグの競合を回避するためには.htaccessの記述を変えることで回避できることまではわかったのですが・・・実際にどのように.htaccessの記述を変えたらいいのか今ひとつわかりません汗
もしよろしければ、以下に私の.htaccessの内容を記載致しますので、どのように記述したらよいのかご教授願えますでしょうか?
よろしくお願い致します。---------.htaccess記述内容 ここから----------
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index¥.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
---------.htaccess記述内容 ここまで----------
- 水瀬 2010年12月13日 05:07
>> ジョージさん
WPの使用経験はほとんどありません。
その為、競合の内容が理解できていません。
どういうリクエストをしたらどういう結果になっているのかなどが不透明です。
また、どういうリクエストでどのような結果を得たいのかもわかりません。MultiViewsを無効にしてみても期待通りにならないですか?
またMultiViewsを無効にできないのであればサーバー側の設定で変更できないのだと思います。もし追求するのであればどういうリクエストを送ってどういう結果を得たいのかを詳細にお書きください。
微力ながら一緒に考えさせていただきます。ちなみにココの確認は滅多にしなくて記事を書くときくらいなので投稿した後にFYAホームページのサポートからでもメールをもらえれば直ぐに気づきます。
Trackbacks:0
- TrackBack URL for this entry
- https://www.fya.jp/cgi-bin/mt/mt-tb.cgi/41
- Listed below are links to weblogs that reference
- mod_rewrite MultiViews from Minase's Blog - FYA