Nginx Rewriteルール設定

NginxのrewriteルールによるURL操作をマスター。rewrite vs returnディレクティブ、正規表現キャプチャ、条件付きリライト、SEOパターンを解説します。

Routing

詳細な説明

NginxのRewriteルールにより、リクエストURIを処理前に変更できます。URL正規化、サイト移行時の永久リダイレクト、クリーンURLルーティングパターンの実装に一般的に使用されます。

rewrite vs return

単純なリダイレクトには常に rewrite より return を優先してください。return ディレクティブは正規表現の評価が不要なため、より効率的です:

# 単純なリダイレクトに推奨(高速)
return 301 https://example.com$request_uri;

# 正規表現キャプチャが必要な場合のみrewriteを使用
rewrite ^/blog/([0-9]+)/(.*)$ /articles/$1-$2 permanent;

Rewrite構文

rewrite ディレクティブは正規表現パターン、置換文字列、処理動作を制御するオプションのフラグを取ります:

rewrite regex replacement [flag];

利用可能なフラグとその意味:

  • last:現在のリライトセットの処理を停止し、新しいURIでlocationマッチングを再開。
  • break:リライト処理を完全に停止し、現在のlocationブロック内でリクエストを処理。
  • redirect:302一時リダイレクトレスポンスを返す。
  • permanent:301永久リダイレクトレスポンスを返す。

正規表現キャプチャ

正規表現パターンで括弧を使用してURIの一部をキャプチャし、置換文字列で $1$2 などで参照します:

# /products/123/details -> /api/products?id=123&view=details
rewrite ^/products/([0-9]+)/([a-z]+)$ /api/products?id=$1&view=$2 last;

条件付きリライト

条件付きリライトには if ディレクティブを使用しますが、Nginxの if には既知の問題があり、単純な条件のみに限定して使用してください:

# すべてのURLから末尾のスラッシュを削除
rewrite ^/(.*)/$ /$1 permanent;

# User-Agentに基づくリダイレクト
if ($http_user_agent ~* "mobile") {
    rewrite ^/(.*)$ /mobile/$1 last;
}

一般的な移行パターン

# クリーンURLのために.html拡張子を削除
rewrite ^/(.+)\.html$ /$1 permanent;

# 旧URL構造から新URL構造へ移行
rewrite ^/old-page$ /new-page permanent;
rewrite ^/category/(.*)$ /topics/$1 permanent;

代替としてのtry_files

多くのルーティングユースケースでは、try_files ディレクティブがrewriteルールよりもクリーンで予測可能です:

try_files $uri $uri/ /index.html;

リライトのデバッグ

リライトログを有効にして、Nginxがリライトルールをどのように処理しているかを正確に追跡します:

error_log /var/log/nginx/error.log notice;
rewrite_log on;

ユースケース

Webサイトを新しいURL構造に移行し、SEO価値を保持しつつリンク切れを防ぐために旧URLから新URLへの永久リダイレクトを設定する必要があります。

Try It — Nginx Config Generator

フルツールを開く