NginxにおけるRewriteルールの活用

URL書き換えの基本

nginxのrewrite指令により、リクエストURLの再構成やリダイレクトが可能になります。

主な利用シナリオ

  • 開発設計支援(ページ遷移、互換性維持)
  • 検索エンジン最適化(SEO)
  • メンテナンス対応
  • セキュリティ強化

設定構文

rewrite 正規表現 宛先 [フラグ];

適用可能セクション:server, location, if

シンプルな例

rewrite ^(.*)$ /maintenance.html break;

全リクエストをmaintenance.htmlに誘導する例

正規表現の活用

Linux環境ではpcretestコマンドでテスト可能

応用例

rewrite index\.php$ /maintenance.html break;
if ($http_user_agent ~ Firefox) {
    rewrite ^(.*)$ /firefox/$1 break;
}

Firefoxユーザのみ特別なルーティングを適用

フラグパラメータの種類

  • last:現在の書き換え処理を終了し、再度マッチングを実施
  • break:完全に処理を終了
  • redirect:302応答(一時的リダイレクト)
  • permanent:301応答(永続的リダイレクト)

lastとbreakの挙動比較

server {
    listen 80;
    server_name example.com;

    location ~ ^/break {
        rewrite ^/break /test/ break;
    }

    location ~ ^/last {
        rewrite ^/last /test/ last;
    }

    location /test/ {
        return 200 'Success';
    }
}

curl -v http://example.com/last/curl -v http://example.com/break/で挙動比較可能

redirectとpermanentの違い

location ~ ^/sample {
    rewrite ^/sample http://target-site.com/ permanent;
    # rewrite ^/sample http://target-site.com/ redirect;
}

permanentはブラウザキャッシュされる永続リダイレクト

実践的な設定例

server {
    listen 80;
    server_name example.com;

    location / {
        rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/lesson_$3.html break;
        
        if ($http_user_agent ~* Safari) {
            rewrite ^/nginx https://example.com/nginx-course redirect;
        }

        if (!-f $request_filename) {
            rewrite ^/(.*)$ https://search-engine.com/$1 redirect;
        }
    }

    error_page 500 502 503 504 404 /error.html;
}

ブラウザ別振り分け、存在しないファイルへの代替ルーティングを実装

処理優先順位

  1. serverレベルのrewriteが最優先
  2. 次にlocationマッチング
  3. 最後にlocation内rewriteが実行

タグ: nginx url-rewrite http-server web-infrastructure http-redirect

7月26日 00:54 投稿