Map Moduleを使用したリダイレクト方法

IMG_1920
少し前に、200ページものURLをリダイレクトさせた時に、Nginxに元々入っているMap Moduleを使用したけど、日本語の説明がすごく少なかったので、メモ

Map Moduleを使ってリダイレクトさせるにはconfigファイルに以下のように書く

map "example" $url {

“example” “example2”

}

この場合だとexampleという文字にマッチした場合は$urlという変数にexample2という値がはいることになります。 ちなみにマッチしない場合は$urlには値がはいりません。

つまり条件判定で以下のようにかければ、マッチしているかどうかがわかります。
if ($url) {

# 一致した場合の記述

}
なので、サンプル
map $request_uri $url {

~^/2015/04/01/.* http://example.com/2015/04/01/art/;

}
server {

listen 80;

server_name example.com;
if ($new) {

rewrite ^ $url permanent;

}
}

でも、これだとconfigファイルに200ページ書かなきゃいけないし、後でconfigファイル見たら「なにこれ???」となるので、mapファイル作ってそれをincludeします。


sudo vi /etc/nginx/conf.d/default.conf

map $request_uri $url {

include /etc/nginx/redirect_list.map;

}
server {

listen 80 default ;
server_name example.com;
root /var/www/vhosts/example;
index index.html index.htm;
charset utf-8;

if ($url) {

rewrite ^ $url permanent;

}
}

/etc/nginx/redirect_list.mapには以下の様に記述します。

~^/2015/04/01/.* http://example.com/2015/04/01/art/;
~^/2015/12/31/.* http://example.com/2015/12/31/demo/;

でも、これだと末尾に」「/」がないとリダイレクトしないので、「/」がなくても一致したと判断しリダイレクトさせる為に正規表現を使用します。

~^/news1377[/]?$ https://example.com/news/news1377;

しか〜し!
大量にリダイレクトをかけると以下のようなエラーが出る。

[ec2-user@ip-111-22-33 ~]$ sudo /etc/init.d/nginx restart
nginx: [emerg] could not build the map_hash, you should increase map_hash_bucket_size: 64
nginx: configuration file /etc/nginx/nginx.conf test failed

map_hash_bucket_sizeが足りないとの事なのでサイズを変更。
map_hash_bucket_sizeは64、128、256があります。Nginxのconfigファイルを変更して、Nginxを再起動したらOK!

sudo vi /etc/nginx/nginx.conf

user nginx nginx;
worker_processes 2;
worker_rlimit_nofile 10240;
http {
include /etc/nginx/mime.types;

default_type application/octet-stream;
client_max_body_size 20M;

client_body_buffer_size 256k;
map_hash_bucket_size 128;
if_modified_since before;
sudo /etc/init.d/nginx restart

又、同じページ名を使用して2重リダイレクトなんてハプニングもある!
例えば、

①元:display-one 新:display にリダイレクト
②元:display 新:display-new にリダイレクト

この場合①と②は違うページです。
これだと、①でリダイレクトしたURLが②の元のURLと同じなので、元:display-oneは 新:display-newにリダイレクトされちゃうって訳です。
まぁ、当然なんですが・・・・
でも、要望であればしないといけ無いので・・・・

location = /display-one/ {
rewrite ^/display-one[/]?$ https://example.com/display permanent;
break;
}

と言うふうに最後にbreakを指定すると、rewriteを終了します。
逆にbreakし無ければループします。
この記述はmapファイルでなく、default.confに記述してくださいね。

と言う事で無事に200ページほどリダイレクトできました!
そして、また!現在、これをApacheでやっている最中です。
今度も、150ページほどリダイレクト(涙)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中