nginx でリダイレクトを行う rewirte の使い方
nginxを使ったサーバー構築では、基本Apacheのような .htaccess が機能しません。nginxで301リダイレクトなどを行いたい場合は、nginxの設定ファイルに rewrite でルールを記述する必要があります。ここでは rewrite の使い方をまとめておきます。
rewrite の概要
nginxでのリダイレクトを行うためには、rewriteディレクティブを使用します。このディレクティブは、指定した条件に一致するリクエストURIを別のURIに書き換えたり、外部のURLへリダイレクトさせたりすることができます。rewriteディレクティブは、サーバーやロケーションコンテキスト内で使用することができます。
基本的な構文は以下の通りです:
rewrite regex replacement [flag];
パラメータ
パラメータ | 説明 |
---|---|
regex | リダイレクトを適用するための正規表現パターン |
replacement | リダイレクト先のURIまたは外部URL |
flag | リダイレクトの動作を制御するオプション |
flagオプション
パラメータ | 説明 |
---|---|
last | 現在のリライト処理を終了し、改めてリライト処理を開始 |
break | 現在のリライト処理を終了し、さらなる処理を行わない |
redirect | 一時的なリダイレクト(302)を行う |
permanent | 永続的なリダイレクト(301)を行う |
実際のリダイレクトの記述例
単純なリダイレクト
以下の設定例では、/old-pageへのアクセスを/new-pageに301リダイレクトします。
rewrite ^/old-page$ /new-page permanent;
複雑なリダイレクト
複数のサブディレクトリに対してリダイレクトを適用する場合、正規表現を使用します。
rewrite ^/old-site/(.*)$ /new-site/$1 permanent;
この例では、/old-site以下の任意のパスへのアクセスを、同じサブパスを保持しつつ/new-siteへリダイレクトします。
便利な機能: return ディレクティブ
リダイレクトを行う別の方法として、returnディレクティブがあります。これは、条件に応じてリダイレクトやエラーページの表示をよりシンプルに設定することができます。
location /old-page {
return 301 /new-page;
}
この方法では、特定のリクエストURIに対して簡潔にリダイレクトを設定でき、rewriteディレクティブを使用するよりも読みやすく、パフォーマンスの面で効率的です。また、HTTPステータスコードを直接指定できるため、リダイレクトの種類を容易に制御できます。
nginxのリダイレクト設定は非常に柔軟であり、サイトの構造変更やURLスキームの更新、外部サイトへのリダイレクトなど、さまざまなシナリオに対応することができます。適切なディレクティブや正規表現を使用することで、必要なリダイレクトルールを効率的に実装できます。
rewrite ディレクティブを別ファイルで管理する
これらのrewriteディレクティブをserverディレクティブへ直接記述しても良いのですが、rewriteルールが多すぎると管理が大変になります。そこで、rewrite ディレクティブを別ファイルで管理する方法を紹介します。これにはincludeディレクティブを使用します。includeディレクティブを使用することで、外部の設定ファイルを読み込んで、メインのnginx設定ファイルをすっきりと保つことができます。
手順
- リダイレクトルールを含む新しいファイルを作成します。例えば、/etc/nginx/sites-available/redirects.confといったパスに保存します。
- この新しいファイルに、すべてのrewriteルールを記述します。
- メインのnginx設定ファイル(または適切なサーバーブロック設定ファイル)にて、次のようにincludeディレクティブを使用して、作成したリダイレクトルールファイルを読み込みます。
server {
# その他の設定 ...
# リダイレクトルールを含む外部ファイルを読み込む
include /etc/nginx/sites-available/redirects.conf;
# その他の設定 ...
}
この手順により、nginx設定のメンテナンスが容易になり、特定の種類の設定を集中管理できるようになります。また、将来的にリダイレクトルールを追加または変更する際に、メインの設定ファイルを直接編集する必要がなくなり、エラーのリスクを減らすことができます。
includeディレクティブは非常に強力で、サーバー設定の柔軟性と再利用性を高めます。ただし、複数のincludeファイルを使用する場合は、それらのファイル間での設定の競合に注意する必要があります。また、nginxの設定を変更した後は、設定のテストとnginxの再起動またはリロードが必要です。