需求:
demo 根據來源IP返回國家碼、郵編,根據UA判斷是否是移動端
方案:
已知,國內CDN廠商的默認配置是不支持這種定制需求的,需要提交工單聯系專業的人士去配置,好在阿里雲支持這種邊緣腳本的方式,降低了配置的門檻,同時也有龐大的函數庫,能夠像積木式地組合出個性化的CDN定制配置。
1. 准備代碼
c_country = client_country()
c_region = client_region()
# 獲取 Country-Code
if c_country {
# say(concat('client_country:', c_country))
add_req_header('X-Country-Code', c_country)
}
if c_region {
# say(concat('client_region:', c_region))
add_req_header('X-Region-Code', c_region)
}
# 判斷UA
if $http_user_agent {
ua = match_re($http_user_agent, '(Android|iPhone|iPad|iPod|Symbian|IEMobile|BlackBerry|networkbench|Windows Phone|MQQBrowser)')
if ua {
add_req_header('X-Is-Mobile-Viewer', 'true')
} else {
add_req_header('X-Is-Mobile-Viewer', 'false')
}
}
2. 開始配置

接入后,並保存,發布到模擬環境
注意:邊緣腳本需要在模擬環境先進行測試再發布到生產環境,先測,測沒問題之后再上生產環境,同時,生產環境也是不支持直接修改的,需要先把生產的規則,先復制到測試環境,修改完了,測試沒問題之后,再推到生產環境,這么做的目的是防止生產環境改錯,造成大量不可用。
3. 模擬環境驗證
綁定 IP 進行測試下
curl -x 42.123.119.100:80 -o /dev/null -v 'http://www.5179.top'

在 nginx 日志處,把加的兩個 header 也打印出來
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$http_x_country_code" "$http_x_is_mobile_viewer"';
nginx 的訪問日志如下:
# 本地機器訪問
100.122.16.158 - - [30/May/2021:18:06:40 +0800] "GET / HTTP/1.1" 200 7770 "-" "curl/7.64.1" "111.199.187.234, 116.211.219.36" "CN" "false"
# 國外機器訪問
100.122.16.250 - - [30/May/2021:18:15:05 +0800] "GET / HTTP/1.1" 200 7770 "-" "curl/7.29.0" "67.218.156.67, 116.211.219.36" "US" "false"
可以看到 Country-Code 已經都能正常取到。
4. 將規則推送至生產環境

此時,生產環境已經生效
5. 如何對上述規則進行debug

然后再次訪問的時候,可以在 URL 的后面添加 ?_es_dbg=wow 的形式去獲取 debug 的過程,
例如:curl http://www.5179.top\?_es_dbg=wow -Iv

對應的1、2、5、9、13、17,其實是對應的代碼行號,根據這個 trace 我們可以很方便的對自定義的規則進行調試。
參考:
1.概述:https://help.aliyun.com/document_detail/126565.html?spm=a2c4g.11186623.6.717.21e71e0cN9Cuw8
2.場景demo:https://help.aliyun.com/document_detail/126571.html?spm=a2c4g.11186623.6.738.4a90238f8ZzYVZ
