1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

mod_rewriteのリダイレクト設定を試して学んだこと

Last updated at Posted at 2025-02-26

はじめに

業務の中で、特定のページを別の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を使用するには、まず.htaccessRewriteEngine 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:

  • RewriteCondRewriteRuleを適用するための条件を設定する際に使用します。
例: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の仕組みについて学ぶことができました。

かなり初歩的なところに躓いてしまいましたが、既存の設定ファイルに追記する場合、どこに書くかが非常に重要であり、記述の順番や他の設定との関係を考慮することが必要だと学ぶことができました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?