1.

Apache mod_rewrite RewriteEngine On|URL書き換えの有効化と記述例

編集
この記事の要点
  • RewriteEngine On は Apache の mod_rewrite有効化するディレクティブ
  • RewriteRuleRewriteCond を機能させるための前提となるスイッチで、リダイレクト・URL 書き換えを使うなら必須
  • RewriteEngine Off で無効化できる。デバッグ時に一時的に止めたいときに便利
  • .htaccess で使うには httpd.conf 側で対象ディレクトリに AllowOverride を許可する必要がある
  • mod_rewrite モジュール自体が有効になっていないと、RewriteEngine On 自体がエラーになる

RewriteEngine On とは

RewriteEngine On は Apache の URL 書き換えモジュール mod_rewrite を有効にするディレクティブです。これを記述しておかないと、後続の RewriteRuleRewriteCondすべて無視されます。

逆に言うと、リダイレクト・URL 正規化・拡張子の隠蔽・特定 IP の遮断など mod_rewrite で実現する処理を 1 つでも書くなら、その先頭でこのディレクティブを必ず宣言します。

書式

RewriteEngine On     # 有効化(デフォルトは Off)
RewriteEngine Off    # 無効化

基本例:HTTP を HTTPS にリダイレクト

最も典型的な使い方が常時 HTTPS 化です。RewriteEngine On を最初に書き、その後に条件と書き換えルールを並べます。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

詳しい SSL 設定の流れは SSLの設定 を参照してください。

www あり / なしの統一

SEO 上、example.comwww.example.com はどちらかに統一しておきます。

# www なしへ統一
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

拡張子なし URL の実現

ユーザには /about と見せて、内部では about.php を読みたいケース。

RewriteEngine On

# ファイル・ディレクトリが実在しないときだけ
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# 拡張子なしを .php にマッピング
RewriteRule ^([^.]+)$ $1.php [L]

古いパスから新しいパスへ恒久リダイレクト

RewriteEngine On
RewriteRule ^old/(.*)$ /new/$1 [R=301,L]

R=301 は「恒久的に移動した」を意味するステータスコードで、SEO の評価も新しい URL に引き継がれます。

.htaccess で使うための前提

.htaccess に RewriteEngine On を書いても効かない場合、原因のほとんどが以下のどちらかです。

① mod_rewrite が有効になっていない

# CentOS / RHEL (httpd) — 標準で有効。読まれているか確認
httpd -M | grep rewrite_module

# Debian / Ubuntu
a2enmod rewrite
systemctl restart apache2

② AllowOverride が許可されていない

.htaccess を読ませるには、対象ディレクトリに対して httpd.conf 側で AllowOverride を許可する必要があります。

<Directory "/var/www/html">
    AllowOverride All      # ← FileInfo だけでも mod_rewrite は使える
    Require all granted
</Directory>

vhost / server config と .htaccess の違い

記述場所反映タイミングパフォーマンス
vhost / httpd.confApache 再起動が必要速い(起動時 1 回読み込み)
.htaccess即反映(再起動不要)遅い(リクエスト毎にディレクトリを遡って探索)

運用上は本番は vhost / httpd.conf に直書き変更頻度が高い箇所だけ .htaccess に置くのが鉄則です。

よくあるエラーと対処

症状原因 / 対処
Invalid command 'RewriteEngine'mod_rewrite が読み込まれていない。LoadModule rewrite_module modules/mod_rewrite.so を有効化
.htaccess に書いても無視されるAllowOverride None のまま。対象 <Directory> で All か FileInfo を許可
無限リダイレクトループ条件が常に真。RewriteCond %{HTTPS} off 等で再帰しないようにガード
500 Internal Server Error正規表現や [flags] の書式ミス。error_log を確認
変更が反映されないvhost に書いた場合は Apache 再起動が必要

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ

同階層のページはありません

最近更新/作成されたページ