Nginxリダイレクト設定ガイド
Nginxは最も広く使われているWebサーバーの一つであり、リダイレクト設定は運用の基本です。主要な2つのツール — returnとrewrite — は混同されがちで、非効率的または壊れた設定の原因になります。
returnとrewriteの比較
return(推奨)
return 301 https://example.com;
- ✅ 高速 — 正規表現エンジンを使わず、HTTPレスポンスを直接送信
- ✅ シンプルな構文、ミスしにくい
- ✅ ほとんどのリダイレクトで公式に推奨
- ❌ URLセグメントのキャプチャと再利用ができない
rewrite(強力だが低速)
rewrite ^/old-path/(.*)$ /new-path/$1 permanent;
- ✅ 正規表現キャプチャグループに対応
- ✅ URL構造の変換が可能
- ❌
returnより低速 - ❌ 複雑な構文、無限ループを作りやすい
💡 基本方針
可能な限りreturnを使用してください。正規表現キャプチャグループや複雑なURL変換が必要な場合にのみrewriteを使用します。
基本的な例
301恒久リダイレクト
server {
listen 80;
server_name old-domain.com;
return 301 https://new-domain.com$request_uri;
}
302一時リダイレクト
server {
listen 80;
server_name example.com;
location /maintenance {
return 302 /maintenance.html;
}
}
単一ページのリダイレクト
location = /old-page.html {
return 301 /new-page.html;
}
HTTP→HTTPS
推奨: 別々のserverブロック
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# サイト設定...
}
⚠️ ifディレクティブは避ける
Nginxコミュニティには「ifは悪」という格言があります。ifディレクティブは特定のコンテキストで予期しない動作を引き起こす可能性があります。HTTPSリダイレクトには別々のserverブロックを使用してください。
www正規化
non-www → www
server {
listen 80;
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
return 301 https://www.example.com$request_uri;
}
www → non-www
server {
listen 80;
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
return 301 https://example.com$request_uri;
}
パスリダイレクト
# ディレクトリのリダイレクト(プレフィックスを除去)
location /blog/ {
rewrite ^/blog/(.*)$ /articles/$1 permanent;
}
# mapによる一括リダイレクト(大量のリストに効率的)
map $uri $new_uri {
/old-page-1 /new-page-1;
/old-page-2 /new-page-2;
}
server {
if ($new_uri) { return 301 $new_uri; }
}
正規表現リダイレクト
# .html拡張子を除去
location ~ ^(.+)\.html$ {
return 301 $1;
}
# 日付ベースのURLプレフィックスを除去
location ~ ^/\d{4}/\d{2}/\d{2}/(.+)$ {
return 301 /$1;
}
よくある落とし穴
1. rewriteループ
# ❌ 無限ループ
location /old/ {
rewrite ^/old/(.*)$ /new/$1;
}
# ✅ permanentフラグまたはreturnを使用
location /old/ {
return 301 /new$request_uri;
}
2. クエリ文字列の消失
# ❌ クエリ文字列が失われる
location /old { return 301 /new; }
# ✅ クエリ文字列を保持
location /old { return 301 /new$is_args$args; }
3. HTTPSターゲットのSSL設定漏れ
HTTP → HTTPSにリダイレクトしても、HTTPSのserverブロックに有効な証明書が設定されていなければ、ユーザーは接続エラーになります。リダイレクトを有効にする前に、必ずHTTPSブロックの存在と証明書の有効性を確認してください。
パフォーマンスのコツ
rewriteよりreturnを優先 — 正規表現エンジンのオーバーヘッドがない- リダイレクトチェーンを短縮:A → B → CではなくA → Cに直接リダイレクト
- 大量のリダイレクトテーブルには
mapを使用 — 設定読み込み時に評価され、リクエストごとではない locationブロックでの不要な正規表現を避け、可能な限りプレフィックスまたは完全一致を使用- 変更後は必ず
nginx -tを実行し、リロード前に構文エラーを検出
リダイレクト設定後は301check.comで検証してください。