nginx でリダイレクトする
nginx でリダイレクトするには、
apacheでは、.htaccessにて設定していた内容を、nginxでは、設定ファイル(/etc/nginx/nginx.conf)で行うだけです。
やり方もそれほど難しくはないので、簡単にやってみましょう。
ここでは、以下の点について、具体的に解説してみます。
ドメイン丸ごとリダイレクトする(ドメイン変更(移転)など)
ドメインへのアクセスを丸ごとリダイレクトする場合、
通常、apacheでは、.htaccessにて、以下のような記述を行って対応します。
1
2
3
4
5
| <IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.redirect.com/$1 [R=301,L]
</IfModule>
|
これは、
3行目:要求ホスト名が、www.example.comなら、次の行へ続けなさい。
4行目:全ての要求をwww.redirect.comへリダイレクトしなさい。
という意味になります。
これをnginxで実現するには、以下のように設定ファイル(/etc/nginx/nginx.conf)を編集します。
server {
server_name www.example.com;
...
rewrite ^(.*)$ http://www.redirect.com$1 permanent;
...
}
|
この文字色部分が、編集箇所でリダイレクトを実施している箇所になります。
基本的に、この1行で大丈夫です。
書き方は、ほとんど同じで、nginx (rewrite)は、URIの先頭にスラッシュ / が必ずあるのに対して、
apache (RewriteRule)では、先頭のスラッシュ / はありません。
注意する点は、それぐらいであとはほとんど同じように記述することができます。
恒久的なリダイレクト HTTP ステータス番号 301 を返して、リダイレクトを実行する場合は、
permanent を用います。
一時的なリダイレクト(302)の場合、
redirect を用います。
rewrite ^(.*)$ http://www.redirect.com$1 redirect;
|
apache で .htaccess ファイルは利用する場合、
AllowOverride ディレクティブ に
All を指定しておきましょう。
( /etc/httpd/conf/httpd.conf )
1
2
3
4
5
| <Directory "/var/www/html">
...
AllowOverride All
...
</Directory>
|
デフォルトの設定では、
Noneになっていると思います。
日本語を含む URL をリダイレクトする
日本語を含む URL をリダイレクトする場合、
通常、apacheでは、.htaccessにて、以下のような記述を行って対応します。
1
| Redirect permanent /リダイレクト元 http://www.example.com/リダイレクト先
|
このように、日本語を含むURLをそのまま指定できます。
以下のように 飛び先のURLには、パーセントエンコードされたURLも指定できます。
1
| Redirect permanent /リダイレクト元 http://www.redirect.com/%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E5%85%88
|
飛び元のURLには、パーセントエンコードされたURLは指定できません。
これをnginxで実現するには、以下のように設定ファイル(/etc/nginx/nginx.conf)を編集します。
server {
server_name www.example.com;
...
rewrite ^/リダイレクト元 http://www.redirect.info/リダイレクト先 permanent;
...
}
|
この文字色部分が、編集箇所でリダイレクトを実施している箇所になります。
apacheの設定とほぼ同じですね。
パーセントエンコードについても同様に飛び先のURLには、指定できます。ただし、apache 同様に 飛び元には使えません。
server {
server_name www.example.com;
...
rewrite ^/リダイレクト元 http://www.redirect.com/%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E5%85%88 permanent;
...
}
|
非常に大事なのは、設定ファイルのエンコードです。
この
エンコードが utf-8 であることが大事です。
以前にエンコードが
euc-jp のままでリダイレクトできずに悩んだことがありました。注意しましょうね。
もしも euc-jp しか使えない環境なら、Hex表記で指定することもできます。
server {
server_name www.example.com;
...
rewrite ^/\xE3\x83\xAA\xE3\x83\x80\xE3\x82\xA4\xE3\x83\xAC\xE3\x82\xAF\xE3\x83\x88\xE5\x85\x83 http://www.redirect.info/%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E5%85%88 permanent;
...
}
|
こんな感じで・・・。 やってやれないことはないけれど、これは苦肉の策で、普通は、utf-8 にコード変換して素直に日本語を使うことが大道だと思いますので、おすすめしません。
あるIPアドレスからの要求時のみリダイレクトする
あるIPアドレスからの要求時のみリダイレクトする場合、
通常、apacheでは、.htaccessにて、以下のような記述を行って対応します。
1
2
3
4
5
| <IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REMOTE_HOST} 111.222.111.222 [NC]
RewriteRule ^(.*)$ http://www.redirect.com/$1 [R=302,L]
</IfModule>
|
これは、以下のような意味になります。
- 3行目:要求元IPアドレスが、111.222.111.222なら、次の行へ続けなさい。
- 4行目:全ての要求をwww.redirect.comへリダイレクトしなさい。
これをnginxで実現するには、以下のように設定ファイル(/etc/nginx/nginx.conf)を編集します。
server {
server_name www.example.com;
...
if ( $remote_addr = '111.222.111.222' ) {
rewrite ^(.*)$ http://www.redirect.com$1 last;
}
...
}
|
この文字色部分が、編集箇所でリダイレクトを実施している箇所になります。
基本的に、if文を使ってリダイレクトできます。
rewrite の パラメータ
last を指定した場合でも HTTP ステータス番号 302 を返して、リダイレクトを実行しますが、
明示的に即実行でOKの場合は、
redirect を用います。
rewrite ^(.*)$ http://www.redirect.com$1 redirect;
|
また、恒久的なリダイレクト HTTP ステータス番号 301 を返して、リダイレクトを実行する場合は、
permanent を用います。
ウェブブラウザの種類でリダイレクトする
ウェブブラウザの種類でリダイレクトする場合、
通常、apacheでは、.htaccessにて、以下のような記述を行って対応します。
ここでは、単純にChromeをwww.redirect.comへ飛ばしてみます。
1
2
3
4
5
| <IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} 'Chrome' [NC]
RewriteRule ^(.*)$ http://www.redirect.com/$1 [R=302,L]
</IfModule>
|
これは、以下のような意味になります。
- 3行目:要求元ブラウザのユーザエージェント名に、Chromeという文字列(大文字小文字を区別せず
[NC]
)を含むなら、次の行へ続けなさい。
- 4行目:全ての要求をwww.redirect.comへリダイレクトしなさい。
これをnginxで実現するには、以下のように設定ファイル(/etc/nginx/nginx.conf)を編集します。
server {
server_name www.example.com;
...
if ( $http_user_agent ~* 'chrome' ){
rewrite ^(.*)$ http://www.redirect.com$1 last;
}
...
}
|
この文字色部分が、編集箇所でリダイレクトを実施している箇所になります。
基本的に、if文を使ってリダイレクトできます。
rewrite の パラメータ
last を指定した場合でも HTTP ステータス番号 302 を返して、リダイレクトを実行しますが、
明示的に即実行でOKの場合は、
redirect を用います。
rewrite ^(.*)$ http://www.redirect.com$1 redirect;
|
また、恒久的なリダイレクト HTTP ステータス番号 301 を返して、リダイレクトを実行する場合は、
permanent を用います。
if文での判定記号には以下の3つがあります。
~ :右辺の文字列が左辺に含まれるか比較します。
~* : 大文字小文字を区別しないで、右辺の文字列が左辺に含まれるか比較します。
= :左辺と右辺が全く同じか比較します。
if文は、必ず、括弧(の前にブランク(半角空白)を入れるようしましょう。
if( xxxx = YYYY ) のようにifの後にブランク(半角空白)を入れないと構文エラーでうまく読み込んでくれないようです。
x if( xxxx = YYYY )
o if ( xxxx = YYYY )
if文は、
server, locationの内でしか使えません。
rewrite文は、
rewrite regex replacement flag
という構成になります。
regex : 正規表現でのマッチパターン
replacement : マッチパターンに一致した場合の変換パターン
flag : リダイレクトフラグ
最後のリダイレクトフラグに何を指定するかで、HTTPのステータス番号も変わってきます。
- last
rewriteは完了で、以降のマッチするURI や locationの処理は継続します。
- break
rewriteは完了です。
- redirect
一時的なリダイレクトの意味で使います。このとき、HTTP ステータス番号 302 を返して、リダイレクトを実行します。
- permanent
恒久的なリダイレクトの意味で使います。このとき、HTTP ステータス番号 301 を返して、リダイレクトを実行します。
このようにnginxでも同じようにリダイレクトができます。
見方によっては、apacheよりすっきりして見やすく感じますね。
rewriteは、if文の中で設定できる数少ないディレクティブのひとつです。
これによって、かなり複雑な処理もできるようになっています。
2012年1月8日, 12:22 PM
[…] apache のかわりにnginxを使ってみる(4) nginx でリダイレクトするには | レンタ… […]
2013年7月3日, 3:00 AM
とても参考になりました!ありがとうございました。
2013年7月4日, 12:19 AM
Suguru Hirahara さん
コメントありがとございます。何かの参考になればうれしく思います。
2015年4月1日, 9:52 AM
ウェブブラウザの種類でリダイレクトする
の説明ミスってますよ
>これは、
>3行目:要求元IPアドレスが、111.222.111.222なら、次の行へ続けなさい。
>4行目:全ての要求をwww.redirect.comへリダイレクトしなさい。
>という意味になります。
2015年4月13日, 2:51 PM
風吹けば名無しさん
ご指摘、ありがとございます、修正しておきました。