htmlcss Apache「MultiViews」オプションを使って2ヶ国語対応

2014年1月15日

ブラウザの言語設定を元にその言語のファイルを表示させる方法のメモ。(不確かな内容があります)

目次

概要

トップのフォルダに以下のような英語、日本語のトップページがある場合。

英語:http://www.mysite.com/index.html
日本語:http://www.mysite.com/indexjp.html

http://www.mysite.com/ にアクセスすると言語設定を検出して

英語の場合は
http://www.mysite.com/index.html を表示

日本語の場合は
http://www.mysite.com/indexjp.html を表示させるようにする。

エクステンションの付いたファイルを作成

英語の index.html を index.html.en という名前で保存

日本語の indexjp.html を index.html.ja という名前で保存

.htaccess ファイルの記述

以下を .htaccess に記述する。

.htaccess

#MultiViews を有効にする
Options +MultiViews
#ファイル名を指定された言語にマップ
AddLanguage ja .ja
AddLanguage ja-jp .ja
AddLanguage ja-jp-mac .ja
AddLanguage en-us .en
AddLanguage en .en
# 優先度が設定されていない場合の優先順位
LanguagePriority en ja
ForceLanguagePriority Prefer
ForceLanguagePriority Fallback
DirectoryIndex index
# 言語名の拡張子が付いていないファイルの言語名
DefaultLanguage en

ファイルをアップロード

「index.html.en」と「index.html.ja」をアップロード。

これで「http://www.mysite.com/」にアクセスすると言語設定を検出してその言語のページ( index.html.ja または index.html.en)が表示される。

この時、以下のようにファイル名を指定すればそのページが表示される。

http://www.mysite.com/index.html を表示
http://www.mysite.com/indexjp.html を表示

元のファイルを削除すると

また、もし「index.html」と「indexjp.html」を削除すると

「http://www.mysite.com/」
「http://www.mysite.com/index.html」
のいずれでアクセスしても言語設定を検出してその言語のページが表示される。

但し、これが期待する動作かどうかはページの構成によると思われる。

上記の例の場合、日本語の環境の場合には「http://www.mysite.com/」,「http://www.mysite.com/index.html」のいずれでアクセスしても「indexjp.html」が表示されるが、もしこのページに英語ページ「index.html」へのリンクがあってもそれは「indexjp.html」にリダイレクトされ、英語ページへ移動できない。

追加情報

2014年5月6日

さくらインターネットのスタンダードプラントいうのを始めて使ってみて、上記の設定をしてみたがエラーになってしまった。 .htaccess での Options ディレクティブによる設定が制限されているためだろうか。

試しに「Options +MultiViews」をコメントアウトしたらエラーが消えて機能している。。。但し、別のレンタルサーバーでは「Options +MultiViews」を設定しないとエラーになる。。。共用サーバーではそれぞれ設定が異なるので色々試すしかないみたい。

参考情報

コンテントネゴシエーション

サーバー(Apache)がブラウザにより提供されたメディアタイプ、 言語、文字セット、エンコーディングの優先傾向に基づいて、 最適なリソースの表現を選択する仕組み。適切な Accept* ヘッダフィールド(Accept-Language, Accept-Charset等)を調べて処理をする。

Apache におけるネゴシエーションでは、以下の二つの方法のどちらかで行われる。

  • タイプマップ ( *.var ファイル) を使う方法。variant を明示的に挙げているファイルを指定する。
  • ‘Multiviews’ を使って、サーバがファイル名にパターン照合を行なってその結果から選択する方法。(こちらを利用)

Multiviews

MultiViews は、ファイルが 要求された時に、最適なファイルを探すように Apache に命令するもので、例えばユーザーエージェントから送信される Accept-Language ヘッダ値に「en」が優先されていれば英語版のファイル、「ja」が優先されていれば日本語版のファイルが送り出されるようになる。

MultiViews はディレクトリ毎のオプションで、httpd.conf や .htaccess で Options ディレクティブによって設定することができる。 Options All が指定されていても MultiViews 機能は有効にならないので明示的に記述する必要がある。

Options +MultiViews で MultiViews を有効にすることができる。

また、MultiViews は DirectoryIndex ディレクティブで指定されたファイルを探す過程にも適用される。

その他

AddLanguage
ファイル名を指定された言語にマップする。最初のパラメーター(MIME-lang)に言語キーワード (Webブラウザーによって送信されるキーワードと同じ) を、2番目のパラメーター(extension)には、Apache がその特定の言語用のファイルで検索すべき拡張子を指定。
LanguagePriority
MultiViews リクエストを扱うときに、クライアントが優先順位を提供していない場合の 言語の優先順位を設定する。MIME-lang のリストが優先度の降順に並ぶ。
ForceLanguagePriority
要求に合うドキュメントを一つだけ返すことができないときに、 LanguagePriority ディレクティブを使ってネゴシエーションの結果を返す
ForceLanguagePriority Prefer
同等の選択肢が いくつかあるときに、HTTP の 300 (MULTIPLE CHOICES) を返す代わりに、 LanguagePriority を使って一つだけドキュメントを返す
ForceLanguagePriority Fallback
HTTP 406 (NOT ACCEPTABLE) を送信する代わりに、 LanguagePriority のリストの最初の variant が送られる

Prefer と Fallback の両方のオプションを 同時に指定することができ、複数の variant があるときは LanguagePriority の最初の variant が送られ、クライアントの許容言語に合う vaiant がないときは 存在するドキュメントで最初のものが送られるようにすることができる。

DirectoryIndex
クライアントが、ディレクトリ名の最後に「/」 を指定してディレクトリインデックスを要求する場合に探すリソースのリストを DirectoryIndex ディレクティブで設定する
DefaultLanguage
Apache がディレクティブのスコープにある、明示的な言語拡張子 (AddLanguage で設定される .fr や .de) のない全てのファイルを、指定された MIME-lang 言語であるとみなすようにする。 拡張子を使用して言語を指定する方法と違い、DefaultLanguage は一つの言語しか指定できない。

上位ディレクトリでのOptions設定は原則として下位ディレクトリまで適用されるが、プラス記号(+)によって先に無効にされていたオプションを有効にすることができる。逆にマイナス記号(-)は有効だった設定を無効にする。記号省略時は、上位ディレクトリでのOptions設定を継承せず、新規にOptions設定が適用される。
http://www.ipa.go.jp/security/awareness/administrator/secure-web/chap4/4_apache.html