はじめに
業務の中で、特定のページを別のURLにリダイレクトする必要があり、mod_rewrite の動作を実際に試しながら学びました。本記事では、その備忘録としてmod_rewrite
の基本的な使い方と、設定時につまづいたポイントと解決方法について紹介します。
なお、今回は以下のようなリダイレクトを設定しようと考えていました。
-
https://dev.hogehoge.jp/old-path
にアクセスがあった場合、
https://test-app.example.com/new-path
にリダイレクトする
1. mod_rewriteとは?
1. 概要
mod_rewrite
はApacheに標準で搭載されているモジュールの一つで、リクエストされたURLを動的に書き換えたり、特定の条件に基づいてリダイレクトを行うことができます。
2. 基本構文
RewriteEngine On:
-
mod_rewrite
を使用するには、まず.htaccess
にRewriteEngine On
を記述して、機能を有効にする必要があります。 - この設定を .htaccess の先頭に記述しないと、
RewriteRule
などのルールが適用されません。
RewriteEngine On
RewriteRule:
-
RewriteRule
を使うことで、指定したパターンのURLを別のURLにリダイレクトできます。
RewriteRule パターン 置換先 [オプション]
例:特定のページをリダイレクト
RewriteEngine On
RewriteRule ^old-page$ /new-page [R=301,L]
-
この設定では、
example.com/old-page
へアクセスするとexample.com/new-page
に301リダイレクトされます。-
[R=301]
:301リダイレクト(恒久的なリダイレクト) -
[L]
:このルールで処理を終了(Last)
-
RewriteCond:
-
RewriteCond
はRewriteRule
を適用するための条件を設定する際に使用します。
例:HTTPからHTTPSへリダイレクト
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
-
%{HTTPS} off
で、HTTPSではないリクエストを検出 - その場合、HTTPSへリダイレクト
<IfModule>
:
-
mod_rewrite
がサーバーで有効になっているかを確認するために、<IfModule>
を使用できます。 - この記述を
.htaccess
に入れることで、mod_rewrite
が無効の場合でもエラーを回避できます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^old-page$ /new-page [R=301,L]
</IfModule>
2. よく使う mod_rewrite
の設定
- 私が今回やりたかったことに加え、他にも色々な設定があるようだったので、よく使いそうなものを備忘がてら記載します。
1. HTTP → HTTPS のリダイレクト
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
2. www
なしのURLを www
ありに統一
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
3. 特定のディレクトリをリダイレクト
RewriteEngine On
RewriteRule ^old-folder/(.*)$ /new-folder/$1 [R=301,L]
3. 実際につまづいたポイント
問題:リダイレクトが適用されず、意図した動作にならなかった
- 既存の設定ファイルにリダイレクトの設定を追加した際に、正しく動作しないという問題が発生しました。
- 具体的には
.htaccess
にリダイレクト設定を記述したところ、404エラーが発生しリダイレクトできずに躓いていました。
原因
-
ProxyPreserveHost On
やその他の設定値の後にRewriteRule
を記述していたため、意図したリダイレクトが機能しなかった。 -
.htaccess
や設定ファイルに追記する際は、どこに書いても良いわけではなく、設定の順番が動作に影響を与えることを理解していなかった。 -
RewriteEngine On
の記述位置も重要で、適切な場所に書かないとmod_rewrite
が有効にならない。
誤った記述
RewriteEngine On
ProxyPreserveHost On
# その他の設定値
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^/old-path$ https://example-storage.test-server.com/new-path [R=301,L]
→ ProxyPreserveHost On
やその他の設定がRewriteRule
より先に書かれていたため、リダイレクトが正しく動作しなかった。
正しい記述
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^/old-path$ https://example-storage.test-server.com/new-path [R=301,L]
ProxyPreserveHost On
# その他の設定値
→ RewriteEngine On
を先に記述し、ProxyPreserveHost On
などの設定を後ろに移動したことで、期待通りの動作になった。
まとめ
今回、初めてサーバーのリダイレクト設定を行い、普段あまり意識していなかったmod_rewrite
の仕組みについて学ぶことができました。
かなり初歩的なところに躓いてしまいましたが、既存の設定ファイルに追記する場合、どこに書くかが非常に重要であり、記述の順番や他の設定との関係を考慮することが必要だと学ぶことができました。