本文通過邊緣節點的邊緣函數來實現請求的轉寄和重新導向,減少對來源站點的壓力,降低使用者訪問的延遲,有效降低來源站點頻寬和計算資源的消耗。
背景
在Web服務的迭代演化中,業務常面臨網域名稱遷移、介面版本升級、多地區流量調度等情境。傳統基於Web伺服器(如Nginx)或ESA控制台的重新導向或轉寄配置,存在生效延遲高、靈活度差、維護成本高等痛點。本文將以ESA邊緣計算平台為例,來給您介紹邊緣函數在這方面的技術優勢。
傳統服務端URL重新導向和轉寄的技術瓶頸 | 邊緣函數在URL重新導向和轉寄的技術優勢 |
效能壓力大 單台Nginx伺服器在500QPS壓力下,重新導向延遲陡增400%(實測資料)。 | 分布式效能躍遷
|
靈活性很差 市面常見方案僅支援基礎字串替換,缺失正則捕獲/動態決策能力。 | 正則編程級控制 支援Regex,可實現動態路徑參數化改寫。 |
方案原理
ESA將使用者請求調度至最優的邊緣節點上,並通過邊緣函數進行處理。
在邊緣函數中,會對請求按照自訂的規則進行匹配。
如果是命中重新導向規則的請求,則直接返回給使用者重新導向的地址。
如果是命中轉寄規則的請求,會對請求進行轉寄,轉寄到對應的來源站點。
方案實現
第一步:添加網站
在ESA控制台,選擇網站管理,單擊新增網站。
在輸入網站頁面中輸入網站,如:
example.com,點擊下一步。在選擇地區和接入方式頁面,在獲得加速與保護的地區處選擇您的網站需要獲得安全加速服務的地區,並在接入方式處選擇CNAME方式,單擊下一步。
在選擇套餐類型頁面,可以通過新購套餐和綁定已購套餐兩種方式選擇合適的套餐,按照控制台指引完成套餐訂購。
新購套餐
在新購套餐頁面根據實際需要選擇合適的套餐。

綁定已購套餐
如果當前已購買套餐,可在已購套餐頁簽中選擇該套餐進行綁定。

在ESA控制台,在左側導覽列單擊網站管理,進入網站管理頁面後單擊目標網站,在網站概況頁面,對網域名稱歸屬權進行驗證。
複製TXT記錄中的記錄值。

在Alibaba Cloud DNS控制台,在左側功能表列單擊,在權威網域名稱頁簽下找到目標網站的網域名稱,單擊解析設定。
在解析設定中單擊添加記錄,按照以下配置添加記錄,單擊確定。
配置項
樣本值
記錄類型
TXT主機記錄
_esaauth記錄值
verify_a186***be8(控制台給出的記錄值)TTL
10分鐘
在ESA控制台,進入目標網站概況頁面,單擊點擊驗證。
驗證成功的情況: 當查看驗證結果時,如果系統提示
驗證成功,則說明驗證已通過,無需進一步操作。驗證失敗的情況: 如果系統提示
驗證失敗,則需要檢查上一步的操作是否正確,並調整相關配置。完成調整後,單擊點擊驗證按鈕重新進行驗證。
第二步:配置邊緣函數
第三步:配置觸發器
在ESA邊緣函數中,觸發器定義了函數指令碼的調用方式。通過網域名稱綁定功能,您可以為函數分配一個網域名稱,直接通過該網域名稱訪問函數。
例如:您已在ESA添加了網站example.com,您想通過function.example.com訪問邊緣函數,那麼function.example.com、function.example.com/user、function.example.com/login等請求均會被轉寄至邊緣函數。
在左側功能表列單擊,在邊緣計算函數和Pages頁面單擊目標函數。
在函數詳情頁面,切換至網域名稱頁簽,單擊添加網域名稱。為邊緣函數分配訪問網域名稱
function.example.com,單擊確定。在網域名稱綁定地區找到上一步所建立的邊緣函數網域名稱,在操作列單擊查看DNS記錄,在DNS記錄管理頁面複製邊緣函數網域名稱對應的CNAME值。

登入Alibaba Cloud DNS控制台,在左側功能表列單擊,在權威網域名稱頁簽下找到目標網站的網域名稱,單擊解析設定。
在解析設定中單擊添加記錄,按以下配置添加記錄,單擊確定。
配置項
說明
樣本值
記錄類型
選擇網域名稱指向的類型。
CNAME
主機記錄
根據網域名稱首碼填寫主機記錄。
function
記錄值
填寫邊緣函數網域名稱對應的CNAME值。
function.example.com.a1.initmm.com
TTL
網域名稱的更新周期,保留預設值。
10分鐘
重新整理DNS記錄頁面,檢查邊緣函數網域名稱對應CNAME狀態是否從待配置轉變為已配置。
說明CNAME生效時間可能需要數分鐘,配置完成之後,如果沒有及時生效,請耐心等待。
第四步:調試並發布函數
登入ESA控制台。
在左側導覽列,選擇。
在函數和Pages列表頁面單擊目標函數,選擇代碼頁簽,將下方的示範代碼粘貼到編輯器中。
// 需求情境,想要實現的功能如下: // 1. 如果請求的Path部分是以”/esa/“開頭,以”.html“結尾的,則直接將請求轉寄到ESA的官網。 // 2. 如果請求的Path部分是以”/product“開頭,則將使用者請求重新導向阿里雲官網產品頁。 // 3. 如果請求未匹配上述規則,則重新導向到阿里雲官網首頁。 // 定義Regex:如Path部分是以”/esa/“開頭,以”.html“結尾的 const productPageRegex = /^\/esa\/.*\.html$/; function handleRequest(request) { const url = new URL(request.url); const pathName = url.pathname; // 如果Path部分是以”/esa/“開頭,以”.html“結尾的,則直接將請求轉寄到ESA產品頁 if(productPageRegex.test(pathName)) { const newUrl = 'https://www.aliyun.com/product/esa'; return fetch(new Request(newUrl, request)); } // 滿足以”/product“開頭,直接重新導向到首頁阿里雲官網產品頁。 if (pathName.startsWith('/product')) { const newUrl = 'https://www.aliyun.com/product/list'; return Response.redirect(newUrl, 301); } // 如果請求未匹配上述規則,則重新導向到阿里雲官網首頁。 const newUrl = 'https://www.aliyun.com/'; return Response.redirect(newUrl, 301); } export default { fetch(request) { return handleRequest(request); } }ESA在控制台代碼開發工具右側提供了一套調試環境,完成代碼開發後,單擊儲存。在右側工具列構造HTTP的要求方法、要求標頭、請求體,構造完成後單擊請求按鈕,控制台將直接返回請求經過函數處理後的響應結果。
調試完代碼後,單擊產生版本。
- 說明
建議的發布順序:先發布測試環境,待測試完成之後,再發布至生產環境。
選擇部署頁簽,單擊版本發布。
單擊生產環境,選擇待發布的版本,然後單擊發布,所有生產環境的節點都將部署該版本函數代碼。

方案驗證及清理
方案驗證
您在驗證的時候,需要將下方樣本中的function.example.com替換成您在第三步中綁定的網域名稱。
驗證ESA邊緣函數的URL轉寄。
直接在瀏覽器中輸入
http://function.example.com/esa/info.html,可以看到瀏覽器在頁面地址欄不變的情況下,展示了阿里雲ESA的首頁,此時邊緣函數的中的轉寄處理已經生效。驗證ESA邊緣函數的URL重新導向。
直接在瀏覽器中輸入
http://function.example.com/product,可以看到瀏覽器會自動跳轉到阿里雲產品頁,並且地址欄的地址也會變為https://www.aliyun.com/product/list。開啟瀏覽器的開發人員工具,找到
http://function.example.com/product的請求資訊,可以看到Status Code是301 Moved Permanently;回應標頭(Response Headers)中Location的值為https://www.aliyun.com/product/list。此時,ESA邊緣函數的重新導向操作已經生效。

資源清理
在本方案中,您建立多個雲資源執行個體。測試完方案後,如果不再需要這些資源,您可以參考以下規則處理對應產品的執行個體,避免繼續產生費用:
刪除ESA加速節點。
登入ESA控制台,在左側導覽列單擊網站管理,在網站管理列表頁面右側操作列單擊刪除。
刪除邊緣函數。
在ESA控制台,在左側導覽列單擊,在函數和Pages列表頁面點擊目標函數,在基本資料頁簽中點擊刪除函數。
刪除DNS解析記錄。
登入Alibaba Cloud DNS控制台,在權威網域名稱解析頁簽下找到目標網站的網域名稱,單擊解析設定。找到第三步:配置觸發器中配置的主機記錄,點擊刪除按鈕。



