本文へスキップ
にゃんこツール

nginxリダイレクト設定生成(HTTPS強制・www統一・301/302)

nginxの server ブロックに貼り付ける設定を、HTTPS強制・www有無の統一・末尾スラッシュ・個別URLの301/302リダイレクトから選んで生成します。; や改行など設定を壊す文字は弾き、リダイレクトのループや重複も警告します。Apacheの場合は .htaccess生成、リダイレクトの意味は HTTPステータスコード一覧 を参照してください。

🔒 ブラウザ内で完結・入力データはサーバーに送信されません

反映前にお読みください

生成した設定は、そのまま本番に反映せず、必ず nginx -t で文法を確認してから reload してください。設定ファイルは事前にバックアップし、ssl_certificate などの値は自分の環境に合わせて書き換えます。

HTTPS

プロキシがHTTPSを終端している場合に選びます。専用のserverブロックではなく、X-Forwarded-Proto ヘッダーを見る if を出力します。

www の有無

パスの正規化

個別URLのリダイレクト

元のパスは / から始め、転送先は / から始まるパスか https:// で始まるURLにします。ステータスは 301(恒久)・302(一時)・307・308 から選べ、省略すると301です。# で始まる行は無視します。元のパスの日本語はそのまま書けます(% によるエンコードは使えません)。

確認事項

    反映後の確認手順

    1. 反映前に、現在の nginx の設定ファイル(/etc/nginx/ 以下など)をバックアップする。
    2. 出力のコメントにある場所へ貼り付ける。「server { }」から始まるブロックは、server ブロックの外(http コンテキスト内)に置く。
    3. nginx -t で文法を確認し、問題がなければ nginx -s reload(または systemctl reload nginx)で反映する。
    4. 次のコマンドで、転送先(Location)とステータス(301など)が意図どおりか、転送が何回も続いていないかを確認する。
    curl -sIL http://example.com/ | grep -iE "^(HTTP|Location)"

    使い方

    1. 「HTTPS強制」「www の統一」「末尾スラッシュ」など、行いたい設定を選びます。
    2. www を統一する場合は「ドメイン」欄に、example.com のようにwwwなしのドメインを入力します。
    3. 個別のURLを転送したいときは、「個別URLのリダイレクト」欄に1行ずつ「元のパス 転送先」を入力します。
    4. 確認事項を見て、「コピー」または「ダウンロード」で出力し、コメントの指示どおりに設定ファイルへ貼り付けます。

    注意事項

    • 出力は設定の断片です。server { } で始まるブロックは、既存の server ブロックとは別に追加します。コメントで Add the following inside your main server block と書かれた部分は、ドメインを担当している既存の server ブロックの中に入れます。
    • HTTPS強制のserverブロックは listen 80 を使います。同じ server_name と listen の組み合わせがすでにある場合は、重複しないように既存のブロックを整理してください。
    • if は nginx では使える場所が限られます。このツールが出力する if は、return または rewrite だけを書く安全な使い方に絞っています。手で処理を追加するときは、nginx の公式ドキュメントにある if is evil の注意点を確認してください。
    • location の照合は、%エンコードを戻したあとのパスに対して行われます。そのため元のパスに % は使えず、日本語などはそのまま書きます。
    • 末尾スラッシュを付けるルールは、拡張子(.)のないURLすべてに働きます。APIのパスなどが意図せず転送されないか確認してください。取り除くルールは、root が決まった server ブロックの中で、実在するディレクトリを除いて働きます。
    • 個別URLのリダイレクトは location として出力されます。完全一致(location =)と前方一致(正規表現)が混在すると、設定上の順序で優先順位が決まります。
    • 301は恒久的な移転として検索エンジンやブラウザにキャッシュされ、あとから戻すのが難しくなります。動作確認が済むまでは302で試すことをおすすめします。
    • 正規表現を直接書く上級者向けの指定には対応していません。複雑な条件は、生成結果を手で編集してください。

    用語解説

    serverブロック

    nginxで1つのサイト(ドメインとポートの組み合わせ)の設定をまとめる記述。server_name で担当するドメインを決める。

    301 / 302リダイレクト

    301は恒久的な移転、302は一時的な移転を表すステータス。検索エンジンは301を新しいURLへの評価の引き継ぎとして扱う。307・308は、リクエストの方式(POSTなど)を保ったまま転送するもの。

    $request_uri

    nginxの変数。リクエストされたパスとクエリ文字列を、書き換え前のまま保持している。リダイレクトでパスとクエリを引き継ぐのに使う。

    location

    nginxでURLのパスごとに処理を振り分ける記述。= は完全一致、~ は正規表現での一致を表す。

    よくある質問

    出力された設定はどこに貼ればよいですか?

    出力のコメントに書いてあるとおり、「server { }」で始まるブロックは既存の server ブロックとは別に追加します(通常は /etc/nginx/conf.d/ 以下のファイルなど、http コンテキストの中)。「Add the following inside your main server { } block」以下は、そのドメインを担当している既存の server ブロックの中に入れます。反映前に nginx -t で確認してください。

    HTTPS強制を入れたら「リダイレクトが繰り返し行われました」と出ます。

    CloudflareなどのCDNやリバースプロキシがHTTPSを終端している場合、nginxにはHTTPで届くため、80番ポートで「HTTPSへ転送」すると無限にループします。「CDN・リバースプロキシ(Cloudflare等)配下で使う」を選ぶと、X-Forwarded-Proto ヘッダーが http のときだけ転送する if を出力するので解消します。CDN側の「常にHTTPSを使用」で済ませる方法もあります。

    なぜ if や rewrite ではなく server ブロックで転送するのですか?

    nginxでは if は使える場所が限られ、書き方によって意図しない動きをします。ホスト名やスキームの転送は、専用の server ブロックで return 301 を書くのが推奨されている方法で、高速で間違いも起きにくいためです。このツールが if を使うのは、プロキシ配下の判定と index.html の除去など、return だけを書く安全な範囲に限っています。

    元のパスに % や ? を書けないのはなぜですか?

    nginxの location は、% エンコードを戻したあとのパス(クエリ文字列を除く)と照合します。そのため /a%20b のように書いても一致せず、日本語などはそのまま書く必要があります。? や # はパスの一部ではないので使えません。また、; { } $ や引用符・改行は、設定ファイルの構文を壊して別の設定を差し込めてしまうため、入力の時点で弾いています。

    完全一致と前方一致の違いは何ですか?

    完全一致は location = を使い、/old というURLだけを転送します。前方一致は正規表現の location で、/old/page のような配下のURLも /new/page のように同じ構成のまま転送します。ディレクトリごと引っ越すときは前方一致、1ページだけの転送は完全一致を使ってください。前方一致で転送先が元のパスの配下にあるとループになるため、エラーとして検出します。

    このページをシェア

    ↑↓ 選択 Enter 開く Esc 閉じる