執行順序
本文說明 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這樣的版本號,表示包含該項的第一個版本。- 即將釋出表示該項還沒有包含在已釋出的版本中。
總覽
節點找到請求所屬的應用後,請求會依次經過以下階段:
- 全域性改寫規則:對分割槽內的每個應用執行全域性改寫規則。
- 應用規則:執行應用的自定義 Edge 語言規則和頁面規則。
- 轉發前處理:應用最終的 URI,啟用錯誤頁,確定快取和上游,然後執行 WAF。
- 快取與上游:查詢快取;未命中快取時,將請求轉發到上游。
- 響應頭:執行響應頭動作。
- 響應體:執行響應體動作和壓縮。
- 日誌:寫入日誌併發送事件。
某些動作會在進入“快取與上游”階段前結束請求,例如退出當前請求並返回狀態碼、限速拒絕和 WAF 攔截。此時節點會跳過後續請求處理,直接生成響應;該響應仍會經過響應頭、響應體和日誌階段。不同動作的差異見在 WAF 之前拒絕的請求和在 WAF 之前傳送的響應。
規則順序
規則匹配後,按以下順序處理:
- 按從上到下的順序執行動作列表。全域性自定義動作在列表中的位置決定其執行順序。
- WAF:登記一次 WAF 檢查。實際檢查在“轉發前處理”階段統一執行。
- 內容:傳送配置的內容,並停止執行後續頁面規則。見在 WAF 之前傳送的響應。
- 代理:記錄上游配置;節點會在“轉發前處理”階段確定實際使用的上游。
- 快取:記錄快取配置;節點會在“轉發前處理”階段應用這些配置。
- 當此規則匹配時,跳過所有後續頁面規則:停止執行後續頁面規則。
動作的生效時間
- 規則執行時:規則匹配後立即執行,後續規則可以看到執行結果。
- 轉發前處理階段或響應頭階段:動作先記錄配置,再由節點在對應階段應用。
結束請求列說明動作是否會在當前規則中結束請求。總是表示必定結束請求;寫有條件時,只有滿足該條件才會結束請求。空白表示該動作不會結束請求。
| 動作 | 生效時間 | 結束請求 | 引入版本 |
|---|---|---|---|
| 設定 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)。