Nginxリダイレクト設定ガイド

目次

Nginxは最も広く使われているWebサーバーの一つであり、リダイレクト設定は運用の基本です。主要な2つのツール — returnrewrite — は混同されがちで、非効率的または壊れた設定の原因になります。

returnとrewriteの比較

return(推奨)

return 301 https://example.com;

rewrite(強力だが低速)

rewrite ^/old-path/(.*)$ /new-path/$1 permanent;

💡 基本方針

可能な限り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ブロックの存在と証明書の有効性を確認してください。

パフォーマンスのコツ

リダイレクト設定後は301check.comで検証してください。