12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-02-03

概要

ブラウザの言語設定を取得して、その言語のページに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への設定自体はとても簡単でしたが、モジュールを追加してビルドするのが何かと大変でした。

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?