ここまでで、nginx + php-fpm上でWordpressを動作するところまで解説してきました。
- apache のかわりにnginxを使ってみる(1) nginxの最新版をインストールする
- apache のかわりにnginxを使ってみる(2) php-fpmをインストールする
- apache のかわりにnginxを使ってみる(3) nginx + php-fpm でWordPressを動かしてみる
今回は、apache からnginx への移行するための環境設定を行ってみます。
その中でも apacheの特徴である .htaccess を使った転送(リダイレクト)について、nginxでどう実現するかを簡単に解説したいと思います。
これも結論から言うと、
rewrite を使うだけなんです。
いくつか例をあげて解説してみましょう。
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 last; : }
基本的に、この1行で大丈夫です。
書き方は、ほとんど同じで、nginx (rewrite)は、URIの先頭にスラッシュ / が必ずあるのに対して、
apache (RewriteRule)では、先頭のスラッシュ / はありません。
注意する点は、それぐらいであとはほとんど同じように記述することができます。
- ある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=301,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文を使ってリダイレクトできます。
- ウェブブラウザの種類でリダイレクトする
ウェブブラウザの種類でリダイレクトする場合、
通常、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=301,L] </IfModule>
3行目:要求元IPアドレスが、111.222.111.222なら、次の行へ続けなさい。
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文を使ってリダイレクトできます。
~ :右辺の文字列が左辺に含まれるか比較します。
~* : 大文字小文字を区別しないで、右辺の文字列が左辺に含まれるか比較します。
= :左辺と右辺が全く同じか比較します。
if文は、必ず、括弧(の前にブランク(半角空白)を入れるようしましょう。
if( xxxx = YYYY ) のようにifの後にブランク(半角空白)を入れないと構文エラーでうまく読み込んでしてくれないようです。
x if( xxxx = YYYY )
o if ( xxxx = YYYY )
if文は、
server, locationの内でしか使えません。
rewrite regex replacement flag
という構成になります。
regex : 正規表現でのマッチパターン
replacement : マッチパターンに一致した場合の変換パターン
flag : リダイレクトフラグ
最後のリダイレクトフラグに何を指定するかで、HTTPのステータス番号も変わってきます。
- last
rewriteは完了で、以降のマッチするURI や locationの処理は継続します。
- break
rewriteは完了です。
- redirect
一時的なリダイレクトの意味で使います。このとき、HTTP ステータス番号 302 を返して、リダイレクトを実行します。
- permanent
恒久的なリダイレクトの意味で使います。このとき、HTTP ステータス番号 301 を返して、リダイレクトを実行します。
見方によっては、apacheよりすっきりして見やすく感じますね。
rewriteは、if文の中で設定できる数少ないディレクティブのひとつです。
これによって、かなり複雑な処理もできるようになっています。
タグ: nginx



2012年1月8日, 12:22 PM
[...] apache のかわりにnginxを使ってみる(4) nginx でリダイレクトするには | レンタ… [...]