在這篇文章中,我們將展示如何根據客戶端的不同語言設定重定向到不同的網頁。

嵌入圖片

支援多語言的源站

假設我們有一個支援在不同路徑下展示不同語言的源站。例如,這是 /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 上游只有一個後端伺服器。也就是我們在影片開頭使用的源站。

螢幕截圖

而且我們也有一個已經定義好的頁面規則。

螢幕截圖

這個頁面規則設定了一個反向代理到我們剛才看到的 my backend 上游。

螢幕截圖

建立一個新的頁面規則。

螢幕截圖

我們啟用一個規則條件來檢查 URI /

螢幕截圖

這個下拉框裡列出了所有我們可以選擇的變數。

螢幕截圖

選擇變數 URI

螢幕截圖

運算子選擇字串等號。

螢幕截圖

螢幕截圖

輸入值 /,表示只匹配根路徑。

螢幕截圖

第二個條件用來檢查語言。

螢幕截圖

螢幕截圖

我們選擇 Request header 作為變數。

螢幕截圖

輸入請求頭名稱 Accept-Language

螢幕截圖

運算子這裡,

螢幕截圖

我們選擇“字首”。

螢幕截圖

這表示當同時指定多種語言時,我們只關心第一種。

我們選擇正規表示式型別 Regex 作為匹配的值。

螢幕截圖

螢幕截圖

輸入正則值 fr\b

螢幕截圖

\b 的意思是匹配一個詞的邊界。這樣寫 frfr-CA 都會匹配得到。

這裡,我們勾選“忽略大小寫”以進行不區分大小寫的匹配。

螢幕截圖

現在我們有了以 AND 相連線的兩個條件。也就是說,必須同時滿足這兩個條件,才能執行下面的動作。已經完成條件的編寫。

現在我們新增一個新的動作。

螢幕截圖

搜尋動作“重定向”。

選擇動作型別“重定向”。

螢幕截圖

然後我們配置跳轉到的目標 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/

如果你喜歡這個教程,請訂閱這個部落格網站和我們的 YouTube 頻道B 站頻道。謝謝!

關於本文和關聯影片

本文和相關聯的影片都是完全由我們的 OpenResty Showman 產品從一個簡單的劇本檔案自動生成的。

關於作者

章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。

章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴, 是 “邊緣計算“、”動態追蹤 “和 “機器程式設計 “的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,並編寫過 60 多個開源軟體庫。

關注我們

如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

我們提供了英文版原文和中譯版(本文) 。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!