執行順序

OpenResty Edge 處理 HTTP 或 HTTPS 請求時,全域性改寫規則、頁面規則和頁面規則動作的執行順序,以及多項配置設定同一內容時以哪一項為準。

本文說明 OpenResty Edge 處理 HTTP 或 HTTPS 請求時,全域性改寫規則、頁面規則和頁面規則動作的執行順序,以及多條規則或多項設定同時影響同一內容時的優先順序。

你可以用它判斷功能之間的關係。例如,WAF 是否會檢查頁面規則改寫後的 URI,響應頭動作是否會作用於快取命中的響應。

本文適用於 OpenResty Edge 26.9.1-1 及之後的版本,僅涵蓋 HTTP 和 HTTPS 應用。

版本標註

引入版本列表示包含該項的第一個 OpenResty Edge 版本:

  • 單元格為空,表示該項在 OpenResty Edge 22.12.1-1 之前已經提供。
  • 24.9.1-1 這樣的版本號,表示包含該項的第一個版本。
  • 即將釋出表示該項還沒有包含在已釋出的版本中。

總覽

OpenResty Edge 處理 HTTP 請求的各個階段

節點找到請求所屬的應用後,請求會依次經過以下階段:

  1. 全域性改寫規則:對分割槽內的每個應用執行全域性改寫規則。
  2. 應用規則:執行應用的自定義 Edge 語言規則和頁面規則。
  3. 轉發前處理:應用最終的 URI,啟用錯誤頁,確定快取和上游,然後執行 WAF。
  4. 快取與上游:查詢快取;未命中快取時,將請求轉發到上游。
  5. 響應頭:執行響應頭動作。
  6. 響應體:執行響應體動作和壓縮。
  7. 日誌:寫入日誌併發送事件。

某些動作會在進入“快取與上游”階段前結束請求,例如退出當前請求並返回狀態碼、限速拒絕和 WAF 攔截。此時節點會跳過後續請求處理,直接生成響應;該響應仍會經過響應頭、響應體和日誌階段。不同動作的差異見在 WAF 之前拒絕的請求和在 WAF 之前傳送的響應。

規則順序

規則匹配後,按以下順序處理:

  1. 按從上到下的順序執行動作列表。全域性自定義動作在列表中的位置決定其執行順序。
  2. WAF:登記一次 WAF 檢查。實際檢查在“轉發前處理”階段統一執行。
  3. 內容:傳送配置的內容,並停止執行後續頁面規則。見在 WAF 之前傳送的響應。
  4. 代理:記錄上游配置;節點會在“轉發前處理”階段確定實際使用的上游。
  5. 快取:記錄快取配置;節點會在“轉發前處理”階段應用這些配置。
  6. 當此規則匹配時,跳過所有後續頁面規則:停止執行後續頁面規則。

動作的生效時間

  • 規則執行時:規則匹配後立即執行,後續規則可以看到執行結果。
  • 轉發前處理階段或響應頭階段:動作先記錄配置,再由節點在對應階段應用。

結束請求列說明動作是否會在當前規則中結束請求。總是表示必定結束請求;寫有條件時,只有滿足該條件才會結束請求。空白表示該動作不會結束請求。

動作生效時間結束請求引入版本
設定 URI規則執行時
新增 URI 字首規則執行時
刪除 URI 字首規則執行時
刪除 URI 片段規則執行時
設定 URI 引數規則執行時
追加 URI 引數規則執行時
刪除 URI 引數規則執行時
設定請求頭規則執行時
新增請求頭規則執行時
刪除請求頭規則執行時
設定變數規則執行時
記錄錯誤訊息規則執行時
延遲規則執行時
使用 Edge 語言規則執行時
執行 Lua 模組規則執行時
映象請求規則執行時
記錄 WAF 日誌規則執行時23.3.1-1
設定上傳的檔案引數規則執行時23.3.1-1
啟用 S3 認證規則執行時25.9.1-1
限制請求速率規則執行時拒絕請求時
限制請求數規則執行時拒絕請求時
限制請求併發量規則執行時拒絕請求時24.9.2-1
封鎖請求規則執行時拒絕請求時
封禁 IP 地址列表規則執行時客戶端 IP 在列表中時26.3.2-1
啟用 Basic 認證規則執行時認證失敗時
啟用 OpenIDC 認證規則執行時把客戶端重定向到身份提供方時
OAuth2 JWT 驗證規則執行時驗證失敗時
OAuth2 introspection 驗證規則執行時驗證失敗時
啟用 hCaptcha規則執行時客戶端尚未通過驗證時
啟用 OpenResty Edge 內建 Captcha規則執行時客戶端尚未通過驗證時
啟用私有訪問 Token規則執行時客戶端尚未通過驗證時26.9.1-1
啟用熔斷器規則執行時熔斷器處於開啟狀態時
啟用 CSRF token規則執行時token 檢查失敗時23.3.1-1
啟用 SSL 客戶端驗證規則執行時客戶端證書驗證失敗時
封禁 IP 地址規則執行時總是26.3.2-1
退出當前請求並返回狀態碼規則執行時總是
重定向規則執行時總是
關閉連線規則執行時總是24.9.1-1
輸出響應體規則執行時總是
返回靜態檔案規則執行時總是
最大請求體大小轉發前處理階段
設定代理 URI轉發前處理階段
重寫代理 URI 字首轉發前處理階段
設定代理主機轉發前處理階段
定製錯誤頁轉發前處理階段
設定代理頭快取與上游階段
追加代理頭值快取與上游階段
傳遞請求頭快取與上游階段25.12.1-1
傳遞請求體快取與上游階段25.12.1-1
使用下游伺服器地址作為上游源地址快取與上游階段22.12.1-1
啟用 WebSocket快取與上游階段
啟用代理快取重新驗證快取與上游階段
使用舊代理快取快取與上游階段
繞過代理快取快取與上游階段26.6.14-1
停用代理快取快取與上游階段26.6.14-1
停用請求緩衝快取與上游階段
停用代理響應緩衝快取與上游階段23.12.1-1
攔截上游錯誤快取與上游階段
啟用 HTTP 重定向跟隨快取與上游階段26.9.2-1
啟用 HTTP 分片快取與上游階段即將釋出
設定響應頭響應頭階段
新增響應頭響應頭階段
刪除響應頭響應頭階段
設定響應 Cookie響應頭階段
設定響應 Cookie 的 SameSite響應頭階段23.3.1-1
設定快取過期時間響應頭階段
根據字尾名設定響應內容型別響應頭階段
響應體過濾響應體階段23.3.1-1
捕獲響應體響應體階段
啟用閘道器 Gzip響應體階段
啟用閘道器 Brotli響應體階段
啟用閘道器 Zstandard響應體階段25.6.1-1
設定 Gzip 型別響應體階段
設定 Brotli 型別響應體階段
設定 Zstandard 型別響應體階段25.6.1-1
限制響應資料速率響應體階段
啟用 OpenTelemetry 跟蹤日誌階段24.9.2-1
設定 OpenTelemetry Span 名日誌階段24.9.2-1
啟用限流事件日誌階段
啟用熔斷器事件日誌階段
停用訪問日誌日誌階段

設定 URI及其他 URI 動作會立即影響後續規則看到的 URI。節點會在“轉發前處理”階段把最終 URI 應用到請求。

啟用 CSRF token會在規則執行時檢查 token,並在響應體階段注入 token。

映象請求會在規則執行時傳送請求副本,並等待副本請求完成。啟用非同步請求映象後,節點會在“快取與上游”階段傳送副本,不等待其完成;如果請求提前結束,則不會發送副本。

OpenTelemetry 相關動作會將請求標記為需要跟蹤。請求結束時,節點會匯出 span。

限速動作和封鎖請求的以下拒絕方式在 22.12.1-1 之後加入:

  • JavaScript 挑戰驗證和重定向驗證(23.3.1-1)
  • 返回頁面模版(24.3.1-1)
  • 標記為拒絕(24.9.7-1)
  • 封禁 IP 地址(26.3.2-1)
  • 私有訪問 Token(26.9.1-1)
  • 無延遲選項在 24.9.1-1 中加入。
  • 延遲日誌在 26.9.20-1 中加入。
  • 即將釋出:僅記錄日誌只在日誌階段把請求寫入 CC 日誌,不會延遲或拒絕請求。

在 WAF 之前拒絕的請求

以下情況下,請求在規則執行時直接結束,跳過轉發前處理階段:

  • 限速動作或封鎖請求拒絕了請求。
  • 執行了封禁 IP 地址,或封禁 IP 地址列表匹配到客戶端。節點關閉連線,不寫訪問日誌。
  • 啟用 Basic 認證、OAuth2 JWT 驗證或 OAuth2 introspection 驗證失敗。
  • 啟用 hCaptcha、啟用 OpenResty Edge 內建 Captcha 或啟用私有訪問 Token 向尚未通過驗證的客戶端發出挑戰。
  • 啟用 OpenIDC 認證把客戶端重定向到身份提供方。
  • 啟用熔斷器動作發現熔斷器處於開啟狀態。

在 WAF 之前傳送的響應

輸出響應體、返回靜態檔案和內容區域會在 WAF 執行之前傳送響應。

衝突與共用項的優先順序

規則之間

下表中的“第一”和“最後”均指實際執行順序:先執行全域性改寫規則,再執行頁面規則。頁面規則依次為置頂規則、普通規則和置底規則;每組內均從上到下執行。

同一條規則內,先執行動作列表,再依次處理 WAF、內容、代理和快取區域。後執行的設定會覆蓋先執行的設定。

專案以哪一項為準
代理區域中的代理到上游最後執行的匹配規則
快取 key 組合以及快取區域的其他選項最後執行的匹配規則。預設啟用快取見下面兩行。
狀態碼 200 的預設啟用快取最後執行的匹配規則
其他狀態碼的預設啟用快取當前版本以第一條匹配的規則為準。即將釋出的版本改為以最後執行的匹配規則為準,與狀態碼 200 一致。
設定代理 URI 和重寫代理 URI 字首最後執行的動作
設定代理主機最後執行的動作
最大請求體大小最後執行的動作
同一狀態碼的定製錯誤頁最後執行的動作
設定快取過期時間和瀏覽器快取後執行的一項。在同一條規則中,瀏覽器快取在動作列表之後執行,以它為準。
同名的設定請求頭、設定代理頭或設定 URI 引數最後執行的動作。新增請求頭和追加 URI 引數則會再新增一個值。
同一個頭的設定請求頭和設定代理頭上游收到的是設定代理頭的值。後續規則的條件和 WAF 看到的是設定請求頭的值。
同名的設定響應頭、新增響應頭和刪除響應頭按執行順序依次生效。設定響應頭還會替換上游返回的同名響應頭。
設定快取過期時間或瀏覽器快取,與作用於 Cache-Control 或 Expires 的響應頭動作以設定快取過期時間或瀏覽器快取為準,節點在響應頭動作之後應用它們
多條規則的 WAF 區域按規則順序執行每一次已登記的檢查。某一次檢查攔截了請求後,請求結束。
多條規則中的限速動作和封鎖請求每個匹配的動作都在所在規則執行並各自計數。第一個拒絕請求的動作結束請求。

頁面規則與設定之間

有些專案也可以在應用的設定和全域性配置 > 通用中設定。對於頁面規則匹配的請求,以頁面規則的動作為準。應用的設定優先於全域性配置,除非它被設為使用全域性配置。

專案優先順序,從高到低
請求體大小上限最大請求體大小動作、應用設定中的應用自定義的最大請求體大小、全域性配置中的最大請求體大小
Gzip啟用閘道器 Gzip 和設定 Gzip 型別動作、應用設定中的使用 Gzip 壓縮響應內容、全域性配置中的 Gzip
Brotli啟用閘道器 Brotli 和設定 Brotli 型別動作、應用設定中的使用 Brotli 壓縮響應內容、全域性配置中的 Brotli
Zstandard啟用閘道器 Zstandard 和設定 Zstandard 型別動作、應用設定中的使用 Zstandard 壓縮響應內容、全域性配置中的 Zstandard
快取重新驗證啟用代理快取重新驗證動作、應用設定中的代理快取重新驗證、全域性配置中的代理快取重新驗證
舊快取使用舊代理快取動作、應用設定中的應用自定義的舊代理快取、全域性配置中的使用舊代理快取
攔截上游錯誤攔截上游錯誤動作、全域性配置中的攔截源站錯誤頁。啟用 HTTP 重定向跟隨也會開啟攔截。
狀態碼的錯誤頁定製錯誤頁動作、全域性配置中的啟用 OpenResty Edge 錯誤頁

應用的設定在全域性改寫規則之後生效。因此,沒有設為使用全域性配置的應用設定會覆蓋全域性改寫規則中的同類動作。應用設定或全域性配置中的請求體大小上限,也會覆蓋全域性改寫規則中的最大請求體大小動作。

WAF

頁面規則匹配後,WAF區域會登記一次 WAF 檢查。節點會在“轉發前處理”階段統一執行所有已登記的檢查,執行時間位於全部頁面規則和頁面底部自定義 Edge 語言規則之後。WAF 的配置方法見開啟應用的 WAF。

因此:

  • WAF 檢查的是頁面規則處理之後的請求,包括改寫後的 URI、修改後的請求頭和請求體。
  • 無論規則排在前面還是後面,其動作都會先於 WAF 執行。限速、驗證碼和認證檢查可能在 WAF 執行前結束請求;退出當前請求並返回狀態碼等動作則會在請求結束前先執行 WAF。
  • 輸出響應體、返回靜態檔案和內容區域會在 WAF 執行前傳送響應。
  • WAF 白名單的條件在頁面規則執行之前檢查,檢查物件是原始請求。匹配的條目作用於每一次 WAF 檢查。
  • WAF 在查詢快取之前執行,因此由快取響應的請求同樣會被檢查。
  • WAF 當前只支援檢查請求,暫不支援檢查響應。攔截動作為僅記錄日誌時,捕獲響應體(23.6.1-1)會把部分響應體寫入 WAF 日誌。
  • 被攔截的請求仍然經過響應頭、響應體和日誌階段,因此響應頭動作和日誌同樣作用於攔截響應。

以下 WAF 選項在 22.12.1-1 之後加入:攔截動作關閉連線、重定向驗證和 JavaScript 挑戰驗證(23.3.1-1),偏執級別(26.6.1-1),以及攔截動作私有訪問 Token 和自定義動作(26.9.1-1)。