Nginxでブラウザ言語判定してリダイレクトさせる方法

More than 3 years have passed since last update.


概要

ブラウザの言語設定を取得して、その言語のページにNginxでリダイレクトさせる設定についてまとめました。

例えば、example.comにアクセスすると、en.example.com や ja.example.comにリダイレクトするようにしたいという場合です。


方針

・Nginxのモジュールを使う

NginXでブラウザ言語を判定するために、Nginxオフィシャルページに載っているモジュール"Accept Language Module"を使うと楽に設定できます。3rdパーティ製のモジュールで、githubにソースコードがあります。

とても便利で良いのですが、ひとつ壁が…。知らなかったんですが、Nginxではモジュールを追加するためには、ソースコードからビルドする必要があります。

・自前で実装する

HTTPのaccept_languageを取得して、そこでロケール判定すれば良いだけなので、自分でNginxのconfに設定を追加すれば出来そうです。が、デバッグもしにくそうで、意外と大変そうです。

結局、今後ほかのモジュールを追加する可能性も考えて、Nginxのモジュールを追加して設定する事にしました。


Nginxソースをダウンロード

Nginx公式から、バージョンを選んでダウンロードします。

$ wget http://nginx.org/download/nginx-1.9.10.tar.gz

$ tar xvf nginx-1.9.10.tar.gz


必要なモジュールを準備

Accept Language Moduleをダウンロードしておきます。

$ git clone https://github.com/giom/nginx_accept_language_module.git

その他、必要になりそうなモジュールも入れておきます。

$ cd /usr/local/src

$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
$ wget http://zlib.net/zlib-1.2.8.tar.gz
$ wget https://www.openssl.org/source/openssl-1.0.1r.tar.gz
$ tar xvf pcre-8.38.tar.gz
$ tar xvf zlib-1.2.8.tar.gz
$ tar xvf openssl-1.0.1r.tar.gz

(注)pcreはないとconfigureでエラーになります

./configure: error: the HTTP rewrite module requires the PCRE library.


configure, ビルド、インストール

configureします。

$ ./configure \

--add-module=/usr/local/src/nginx_accept_language_module \
--with-pcre=/usr/local/src/pcre-8.38 \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-openssl=/usr/local/src/openssl-1.0.1r \
--with-http_ssl_module

上記のadd_moduleでaccept_language_moduleを入れます。(上記のパスは、モジュールのある場所を指定してください。)

configureがうまく行けば、makeしてインストールです。

$ make

$ sudo make install

nginxのバージョンが出るようになればOKです。

これが出ない場合は、PATHを設定してあげると良いと思います。

$ nginx -v

nginx version: nginx/1.9.10


起動ファイルの準備

起動ファイルはなかったので、ここを参考にします。

https://www.nginx.com/resources/wiki/start/topics/examples/initscripts/

自分の環境のものを取得し、少しだけ、設定を変更すればOKです。

$ cd /etc/init.d

$ sudo vim nginx

変えたのは次の部分だけでした。

nginx="/usr/local/nginx/sbin/nginx"

...
NGINX_CONF_FILE="/etc/nginx/nginx.conf"

これで動くと思います。

$ sudo service nginx start


ブラウザ言語判定してリダイレクト

ようやくですが、/etc/nginx/以下のconfファイルに設定していきます。

Accept Languageモジュールのおかげで、英語と日本語など普通の判定ならたった2行で可能でした。

中国語も試しましたが、問題なく動作しました。

(/etc/nginx/nginx.conf)

server {

...
set_from_accept_language $lang en ja;
rewrite ^(.*)$ $scheme://$lang.example.com$1;
...
}

この set_from_accept_language というのが、追加したモジュールによって提供されたメソッドで、$langという変数にロケールが入ります。

ブラウザのロケールが英語の場合は"en"が入り、日本語の場合は"ja"が入ります。どちらにもヒットしない場合は、最初のdefaultのロケール "en"がセットされます。

・デバッグ

余談ですが、デバッグする際は、add_headerを使うと便利でした。

server {

...
add_header debug_var $lang;
...
}

とすると、Nginxがレスポンスヘッダーにdebug_varを付けてくれて、$langの中身を確認できます。

confへの設定自体はとても簡単でしたが、モジュールを追加してビルドするのが何かと大変でした。