Apacheリダイレクト設定ガイド
Apacheのリダイレクトは主に.htaccessファイルとmod_rewriteモジュールで設定します。メインのサーバー設定にアクセスできない共有ホスティングでは特に便利です。
.htaccessの基本
.htaccessはApacheのディレクトリ単位の設定ファイルです。サイトのルートに配置すると、Apacheが自動的に読み込みます。ファイル名がドットで始まるため、Unix系システムでは隠しファイルになります。
mod_rewriteの有効化
# Ubuntu/Debian
sudo a2enmod rewrite
sudo systemctl restart apache2
# CentOS/RHEL — /etc/httpd/conf/httpd.conf でコメントを解除:
LoadModule rewrite_module modules/mod_rewrite.so
.htaccessオーバーライドの許可
<Directory /var/www/html>
AllowOverride All
</Directory>
Redirectディレクティブ
最もシンプルな方法 — 正規表現不要:
# 301恒久リダイレクト
Redirect 301 /old-page.html https://example.com/new-page.html
# 302一時リダイレクト
Redirect 302 /sale https://example.com/promo
# サイト全体を新ドメインにリダイレクト
Redirect 301 / https://new-domain.com/
💡 Redirectの制限
Redirectディレクティブはシンプルですが、正規表現や条件分岐には対応していません。より複雑な処理にはRewriteRuleを使用してください。
RewriteRule
RewriteEngine On
# HTTP → HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# non-www → www
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
よく使うフラグ
[R=301]— 301恒久リダイレクト[R=302]— 302一時リダイレクト[L]— 最後のルール、処理を停止[NC]— 大文字小文字を区別しない[QSA]— 元のクエリ文字列を追加
RewriteCond
後続のRewriteRuleが実行される前に満たすべき条件:
# モバイルユーザーをリダイレクト
RewriteCond %{HTTP_USER_AGENT} "android|iphone|ipad" [NC]
RewriteRule ^(.*)$ https://m.example.com/$1 [R=302,L]
# クエリ文字列に基づくリダイレクト
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^article$ /post/%1? [R=301,L]
よくあるシナリオ
HTTPS + wwwを強制
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
.html拡張子を除去
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.+)$ $1.html [L]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(.+)\.html
RewriteRule ^ /%1 [R=301,L]
WordPressパーマリンク
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
よくある落とし穴
500 Internal Server Error
ほぼ確実に.htaccessの構文エラーです。Apacheのエラーログを確認してください:
tail -f /var/log/apache2/error.log
リダイレクトループ
# ❌ ループ — 再マッチを停止する条件がない
RewriteRule ^(.*)$ https://example.com/ [R=301,L]
# ✅ HTTPS条件を追加
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/ [R=301,L]
クエリ文字列の消失
# ❌ クエリ文字列が失われる
RewriteRule ^old-page$ /new-page [R=301,L]
# ✅ QSAフラグで保持
RewriteRule ^old-page$ /new-page [R=301,L,QSA]
デバッグ
# リライトログを有効化(Apache 2.4)
LogLevel alert rewrite:trace3
# curlでテスト
curl -I http://example.com/old-page
curl -IL http://example.com/old-page
または301check.comでリダイレクトチェーン全体を可視化できます。