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;
}
ブラウザ別振り分け、存在しないファイルへの代替ルーティングを実装
処理優先順位
- serverレベルのrewriteが最優先
- 次にlocationマッチング
- 最後にlocation内rewriteが実行