さくらサーバーでRewriteがうまく動かない。。。MultiViewsが原因でした

2024.07.22 12:10 ブログ

さくらサーバーでRewriteがうまく動かない。。。MultiViewsが原因でしたの画像


ウェブ開発において、サーバー設定の問題はしばしば頭を悩ませる一因となります。特に、URLのリダイレクトや変換を行うためのRewriteモジュールに関する問題はよく耳にします。今回は、さくらインターネットのレンタルサーバーを使用する際に直面した「Rewriteルールがうまく動かない」という課題について、原因と解決方法を詳しく紹介します。予期せぬ原因、MultiViewsオプションの影響がありました。(気づくまでに少し時間がかかりました・・・)
 

前提条件と状況の把握


まず、前提条件としてさくらインターネットのレンタルサーバーを使用する案件があり、そちらの環境で出くわしたケースとなります。そして、特定のURLパスをリダイレクトするために`.htaccess`ファイルを用いたRewriteルールを設定していました。

例えば、`/old-page`というパスにアクセスすると、自動的に`/new-page`にリダイレクトされることを期待していました。以下に示すような簡単なRewriteルールを記載していたのです:

apache
RewriteEngine On
RewriteRule ^old-page$ /new-page [R=301,L]



この設定が適切に機能すると思い、ブラウザで`/old-page`にアクセスしてみると、期待通りにリダイレクトされませんでした。何度も設定を確認し、htaccessの削除やキャッシュクリアを試みましたが、状況は改善しません。
 

問題の原因調査


エラーログを調べていると「Negotiation: discovered file」というエラーを発見、さらに調べると

その中で目にとまったのが「MultiViews」オプションです。これは、Apacheのコンテンツネゴシエーション機能の一つで、同じ名前のファイルが複数存在する場合に、クライアントのリクエストに応じて適切なファイルを自動的に選択するためのものです。具体的には、URLに拡張子がない場合でも適切なリソースを見つけ出し、返却する機能です。

私は基本MultiViewsオプションを有効にしていないサーバーばかり触っていたので、これに気づきませんでした・・

 

MultiViewsの影響


私の状況を例にすると、MultiViewsオプションが有効になっていると、サーバーはまず`/old-page`に対するリクエストを見て、その後可能なファイル名やディレクトリを探し始めます。例えば、`/old-page.html`や`/old-page.php`といったファイルが存在するかどうかをチェックします。

この動作が最初に行われるため、Rewriteルールは無視されてしまうことになります。したがって、MultiViewsが有効な環境では、Rewriteルールが期待通りに機能しない可能性があるのです。
 

解決方法


解決策としては、まずMultiViewsを無効化することが考えられました。これにより、Apacheはファイル名のネゴシエーションを行わず、直接Rewriteルールを適用するようになります。

以下のように`.htaccess`ファイルを修正しました:

apache
Options -MultiViews

RewriteEngine On
RewriteRule ^old-page$ /new-page [R=301,L]



この変更を保存し、サーバーにアップロードし、再度ブラウザからアクセスしたところ、期待通りにリダイレクトが成功しました。
 

まとめと最終的な考察


今回の経験から学んだことは、サーバー設定の中には意図しない動作を引き起こすオプションが存在するということです。特に、複数の機能が複雑に絡み合う場合、その影響を理解し、個々の問題を丁寧に解決するための知識と技術が求められます。

さくらインターネットのレンタルサーバーは高い機能と柔軟性を提供していますが、それだけに設定の微妙な違いが大きな影響を及ぼすことがあります。今回はMultiViewsオプションという機能が原因でしたが、起こっている現象から想定される対策を瞬時に導き出せる幅広い知識が必要だなと再認識できる一件でした。

どこかで同じ問題で躓いている方の手助けになれば幸いです。

 

無料相談・お問い合わせ Web制作・システム開発に関する
ご相談はこちらよりご連絡ください。

お客様のビジネスの成長と成功を支えるパートナーとして、
どんなご相談でもお待ちしております。お気軽にお問い合わせください。