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への永久リダイレクトを設定する必要があります。