概要
ブラウザの言語設定を取得して、その言語のページに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
起動ファイルの準備
起動ファイルはなかったので、ここを参考にします。
自分の環境のものを取得し、少しだけ、設定を変更すれば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への設定自体はとても簡単でしたが、モジュールを追加してビルドするのが何かと大変でした。