この記事では、クライアントの言語設定に基づいて異なるウェブページにリダイレクトする方法をご紹介します。

嵌入图片

多言語対応のオリジンサーバー

異なるパスで異なる言語を表示するオリジンサーバーがあるとします。例えば、これは /cn/ パスです。

$ curl 'http://test-edge.com/en/'
Hello, world!

ここでは中国語で「你好,世界!」と表示されています。

/fr/ パスにはフランス語版もあります。

$ curl 'http://test-edge.com/fr/'
Bonjour, le monde!

ここではフランス語で表示されています。

リダイレクト用のページルールの作成

今日の目標は、クライアントがルートパス / にアクセスした際に、その言語設定に基づいて特定の言語パスに自動的にリダイレクトすることです。クライアントが送信する Accept-Language リクエストヘッダーを使用します。

嵌入图片

いつものように、OpenResty Edge の Admin Web コンソールにアクセスしましょう。これはサンプルデプロイメントのコンソールです。各ユーザーには独自のローカルデプロイメントがあります。

今回も test-edge.com ドメインのサンプルアプリケーションを使用します。

このアプリケーションに入ります。

屏幕截图

すでにアップストリームが定義されています。

屏幕截图

この my backend アップストリームには 1 つのバックエンドサーバーしかありません。これは動画の冒頭で使用したオリジンサーバーです。

屏幕截图

また、すでに定義済みのページルールもあります。

屏幕截图

このページルールは、先ほど見た my backend アップストリームへのリバースプロキシを設定しています。

屏幕截图

新しいページルールを作成しましょう。

屏幕截图

URI / をチェックするルール条件を有効にします。

屏幕截图

このドロップダウンボックスには、選択可能なすべての変数が表示されています。

屏幕截图

変数 URI を選択します。

屏幕截图

演算子には文字列等号を選択します。

屏幕截图

屏幕截图

値として / を入力し、ルートパスのみにマッチするようにします。

屏幕截图

2 つ目の条件は言語をチェックするためのものです。

屏幕截图

屏幕截图

変数として Request header を選択します。

屏幕截图

リクエストヘッダー名として Accept-Language を入力します。

屏幕截图

演算子については、

屏幕截图

「プレフィックス」を選択します。

屏幕截图

これは、複数の言語が指定されている場合、最初の言語のみを考慮することを意味します。

マッチング値の正規表現タイプとして Regex を選択します。

屏幕截图

屏幕截图

正規表現の値として fr\b を入力します。

屏幕截图

\b は単語の境界にマッチすることを意味します。これにより、frfr-CA の両方がマッチします。

ここでは、大文字小文字を区別しないマッチングを行うために「大文字小文字を無視」にチェックを入れます。

屏幕截图

これで、AND で接続された2つの条件ができました。つまり、両方の条件を同時に満たす必要があり、その場合にのみ以下のアクションが実行されます。条件の記述は完了しました。

次に、新しいアクションを追加します。

屏幕截图

「リダイレクト」アクションを検索します。

アクションタイプとして「リダイレクト」を選択します。

屏幕截图

次に、リダイレクト先の URI を設定します

屏幕截图

「カスタム」を選択します。URI を自分で入力します。

屏幕截图

/fr/ と入力します。

屏幕截图

他のフィールドはそのままにしておきます。

屏幕截图

このルールにマッチした場合、残りのすべてのページルールをスキップします。

屏幕截图

このルールが他のルールよりも先に実行されるようにする必要があります。これをトップルールとしてマークします。トップルールは通常のルールではありません。

屏幕截图

このルールを保存します。

屏幕截图

新しく追加されたページルールが実際にルールリストの最上部にあることが確認できます。

屏幕截图

以前のプロキシルールの前に表示されています。

いつものように、このルールを有効にするにはリリースする必要があります。

屏幕截图

屏幕截图

リリースします!

屏幕截图

同期が完了したことが確認できます。

屏幕截图

これで、新しいページルールがすべてのゲートウェイクラスターとサーバーにプッシュされました。

設定の変更にはサーバーのリロード、再起動、バイナリのアップグレードは必要ありません。そのため、非常に効率的でスケーラブルです。

嵌入图片

ページルールのテスト

ターミナルで、curl を使用して HTTP リクエストを送信できます。

curl -I -H 'Accept-Language: fr-CA, fr, en' http://test-edge.com/

ここでは3つの言語を指定しています:fr-CA、fr、en。したがって、このリクエストでは、フランス語が英語よりも優先されます。

屏幕截图

このコマンドを実行します。

ここで /fr/ にリダイレクトされていることに注目してください。

屏幕截图

curl コマンドにリダイレクトを自動的に追跡させることができます。

curl -L -H 'Accept-Language: fr, en' http://test-edge.com/

ここでは -L オプションを使用しています。

屏幕截图

このコマンドを実行します。

フランス語のテキストが返されていることが確認できます。

屏幕截图

英語ページへのリダイレクト用の新しいページルールの追加

次に、クライアントが他の言語のリクエストヘッダーを送信した場合に英語ページにリダイレクトする汎用的なページルールを追加します。

屏幕截图

新しいページルールを作成します。

屏幕截图

URI / をチェックするルール条件を有効にします。

屏幕截图

屏幕截图

URI を選択します。

屏幕截图

文字列等号を選択します。

屏幕截图

屏幕截图

前回と同様に値 / を入力します。

屏幕截图

条件の記述が完了しました。今回はリクエストヘッダーをチェックする必要はありません。

前回と同様に、新しいリダイレクトアクションを追加します。

屏幕截图

屏幕截图

屏幕截图

屏幕截图

今回は、ターゲット URI として /en/ を入力します。

屏幕截图

このルールにマッチした場合、残りのすべてのページルールをスキップします。

屏幕截图

このルールが他の「通常のルール」よりも先に実行されるようにする必要があります。

屏幕截图

このルールを保存します。

屏幕截图

新しく追加されたページルールがプロキシルールの前にあり、前回追加したフランス語ルールの後にあることが確認できます。

屏幕截图

新しい設定のリリースをもう一度行います。

屏幕截图

屏幕截图

再度リリースします!

屏幕截图

同期が再び完了しました。

新しいページルールのテスト

今回はブラウザを使用して / パスをテストします。ブラウザの言語設定は英語です。

ここでは英語のテキスト「Hello, world」が返されていることが確認できます。

屏幕截图

アドレスバーから、URI が /en/ に変更されていることも確認できます。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty Edge(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英文版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!