根據http請求資訊區分訪問使用者的國家 語言資訊

2021-07-02 05:11:58 字數 4120 閱讀 5238

今天要介紹的就是如何識別不同國家,只需要簡單幾步,就能識別出來自不同國家的請求,使你的web應用更有國際範。

國家識別主要用到的是http header中的host,accept-language,cookie以及請求的url,ip等。

下面先溫習下http header的基礎知識。

在web開發中,無論是前端或後端都會傳送請求,來瀏覽網頁。而我們在開發中經常需要識別出客戶端的資訊,比如,國家,地區,瀏覽器資訊等等。而這些資訊都是由http header傳送的。

下面首先介紹下公司在擴充套件國際化業務中,識別客戶端國家版本,使用了哪些http header。

http headers是http請求和相應的核心,它承載了關於客戶端瀏覽器,請求頁面,伺服器等相關的資訊。

請求的web伺服器網域名稱位址。

例如web請求url:http://test. baidu.com /test/

host就為test.baidu.com。

在php中,可以通過$_server['http_host'] 或 $_server['server_name']來檢視。

accept-language: en-us,en;q=0.5

這個資訊可以說明使用者的預設語言設定。如果**有不同的語言版本,那麼就可以通過這個資訊來重定向使用者的瀏覽器。

它可以通過逗號分割來攜帶多國語言。第乙個會是首選的語言,其它語言會攜帶乙個「q」值,來表示使用者對該語言的喜好程度(0~1)。

在php中用 $_server["http_accept_language"] 來獲取這一資訊。

會傳送你瀏覽器中儲存的cookie資訊給伺服器。

cookie: phpsessid=r2t5uvjq435r4q7ib3vtdjq120; foo=bar

它是用分號分割的一組名值對。cookie也可以包含session id。

在php中,單一的cookie可以訪問$_cookie陣列獲得。你可以直接用$_session array獲取session變數。如果你需要session id,那麼你可以使用session_id()函式代替cookie。

上面介紹了幾個常用的http header,現在您已經確信可以嘗試下,來識別下這些國家版本了。

在介紹例子前,先了解下國家識別中的已知的規範。

規範規定:tag 以第一部分表示語言,都為小寫,第二部分為地區,大寫。中間通過中劃線分隔。

以下列出幾個常見使用到的縮寫規範tag:

這種方式是通過客戶端請求的網域名稱,如果有支援對應網域名稱下的語言,則成功識別。

這裡的網域名稱是傳送header中的host請求,在php中通過$_server['server_name']獲取。

比如我們瀏覽**:

首頁,看看瀏覽器傳送的請求(以windows下,firefox瀏覽器為例),

如上圖看到的,header中host 為當前的網域名稱,那我們可以按照以下步驟識別:

1. 後端配置好當前網域名稱和國家版本的對應關係

2. server端的php程式中通過$_server['server_name'] 獲取header中的host。

3. 根據第一步中的對應關係找到匹配的國家版本(region),並通過locale的對應關係找到語言。

url & cookie 方式

該方式的原理如下表:

1) url 方式

這種方式是通過在url中傳入語言的引數來確定國家版本。

應用場景就如訪問了埃及國家網域名稱,那你檢視的預設是阿拉伯語。假如想使用其他語言瀏覽埃及網域名稱下的頁面(如英文),這時就需要使用url方式。

比如我們瀏覽**:?locale=en-eg。

url方式傳入的國家語言資訊優先順序要高於host方式等其他方式,為最高優先順序。

通過請求頁面傳遞的cookie資訊(locale)來識別版本。

這種方式是客戶端首次瀏覽完頁面後,服務端通過host方式確認了國家語言版本後,就會在客戶端設定cookie。下面的瀏覽請求傳送的http header都會帶有該cookie資訊。

下面舉例介紹下cookie方式的流程:

首次訪問通過host方式識別出國家語言資訊後的,http response header如下:

如上圖所示,第一次請求後,客戶端的cookie會被設定為ar-eg。

那接下來客戶端傳送的請求header中都會帶有該cookie。

服務端的識別流程就如下:

1. 獲取請求中的cookie,如果有國家語言資訊,則進行下面

2. 判斷獲取的國家語言資訊當前是否支援,如果支援則返回該語言下的版本,不支援在使用預設語言版本。

我們知道ip可以用來識別網路中的主機。而且ip位址段的劃分是有規律的,每個國家有不同的位址段。

那我們就可以獲取客戶端的ip位址,通過ip位址庫,來識別國家地區,並根據國家來設定語言。

該方式的識別流程就如下:

1. 獲取請求客戶端的ip

2. 根據ip,確定國家,使用國家的預設語言(和其他方式一起還能識別特定語言,如accept_lanuage明確表明請求語言,可以優先展示該語言)回顯給客戶端

「accept_language」是為rfc2616的http/1.1中14.4段定義的乙個可選http報頭,通常被用來宣告代表使用者接收語言偏好。

當客戶端請求的時候,會傳送預設的accept_language,服務端獲取該值,如果支援,就返回該語言的版本。

該方式的識別流程就如下:

1. 獲取請求客戶端的accept_language

2. 判斷獲取的國家語言資訊當前是否支援,如果支援則返回該語言下的版本,不支援在使用預設語言版本。

這種方式有個缺點是:和使用者使用的瀏覽器是版本有關。

如:瀏覽器是使用中文版的firefox,那傳送header請求的時候,會自動加入。

accept-language zh-cn.

下圖所示為中文版firefox的請求,那麼如果使用者有多個語言版本的瀏覽器,就會在不同版本的瀏覽器,出現不同的語言。(如:在中文版firefox中瀏覽顯示中文介面,而在英文版firefox中瀏覽顯示英文介面)

這種場景在雙語國家出現的概率比較大,開發中可以根據自己的需求,靈活設定,把此種識別方式的優先順序設定的低點(下面有優先順序的詳細介紹)。

也許你可能問,我傳送header請求的時候同時有host , cookie, url, accept_language, ip位址。

那最終按那個方式來確認客戶端請求的國家語言呢?

那就需要設定各個方式的優先順序,國際化識別的一般的順序,可以如下:

1) url方式

2) cookie 方式

3) domain方式

4) accept_language方式

5) ip方式

那為什麼按上面的優先順序呢?

url方式屬於使用者明確切換語言的情況,肯定需要最高的優先順序。而cookie做為第二個可以減少識別的邏輯,使識別更加容易,複雜的識別邏輯只在客戶端第一次請求時。

當然,可以根據自己的需求安排優先順序。

在開發大型web程式中可以靈活使用這些方式,就可以識別出國家語言的資訊,進而開發出支援多種語言的web應用。

HTTP請求頭資訊

錯誤 解釋 100 continue 101 witching protocols 200 ok 201 created 202 accepted 203 non authoritative information 204 no content 205 reset content 206 parti...

SQL Server 訪問傳送Http請求

通用讀取獲取資料儲存過程 開啟sql server 通訊配置 sp configure show advanced options 1 goreconfigure gosp configure ole automation procedures 1 goreconfigure goexec sp c...

http 請求頭資訊解釋

header 解釋示例 accept 指定客戶端能夠接收的內容型別 accept text plain,text html accept charset 瀏覽器可以接受的字元編碼集。accept charset iso 8859 5 accept encoding 指定瀏覽器可以支援的web伺服器返...