文件說明
一個 專案

Caddyfile 指令

指令是出現在站點區塊中的功能性關鍵字。 有時,它們可能會開啟自己的區塊,其中可以包含子指令,但除非另有說明,否則指令不能在其他指令內使用。 例如,您不能在 file_server 區塊內使用 basic_auth,因為 file_server 不知道如何進行身份驗證。 但是,您可以在特殊的指令區塊(如 handleroute)中使用某些指令,因為它們專門設計用於將 HTTP 處理器指令分組。

以下指令是 Caddy 的標準配備,可用於 HTTP Caddyfile 中

指令 描述
abort 中止 HTTP 請求
acme_server 嵌入式 ACME 伺服器
basic_auth 強制執行 HTTP 基本身份驗證
bind 自訂伺服器的 socket 位址
encode 編碼(通常壓縮)回應
error 觸發錯誤
file_server 從磁碟提供檔案
forward_auth 將身份驗證委派給外部服務
fs 設定用於檔案 I/O 的檔案系統
handle 互斥的指令群組
handle_errors 定義處理錯誤的路由
handle_path 類似 handle,但會移除路徑前綴
header 設定或移除回應標頭
import 包含程式碼片段或檔案
intercept 攔截其他處理器寫入的回應
invoke 調用具名路由
log 啟用訪問/請求記錄
log_append 將欄位附加到訪問日誌
log_skip 跳過匹配請求的訪問記錄
log_name 覆寫要寫入的記錄器名稱
map 將輸入值映射到一個或多個輸出
method 在內部變更 HTTP 方法
metrics 配置 Prometheus 指標公開端點
php_fastcgi 透過 FastCGI 提供 PHP 網站
push 使用 HTTP/2 伺服器推送將內容推送到用戶端
redir 向用戶端發出 HTTP 重定向
request_body 操作請求 body
request_header 操作請求標頭
respond 向用戶端寫入硬編碼的回應
reverse_proxy 強大且可擴展的反向代理
rewrite 在內部重寫請求
root 設定網站根目錄的路徑
route 一組被視為單一單位的指令
templates 在回應上執行範本
tls 自訂 TLS 設定
tracing 與 OpenTelemetry tracing 整合
try_files 取決於檔案是否存在的重寫
uri 操作 URI
vars 設定任意變數

語法

每個指令的語法看起來都像這樣

directive [<matcher>] <args...> {
	subdirective [<args...>]
}

<尖括號> 表示要替換為實際值的符號。

[方括號] 表示選用參數。

省略號 ... 表示延續,即一個或多個參數或行。

子指令通常是選用的,除非另有文件說明,即使它們沒有出現在 [方括號] 中。

匹配器

大多數(但非全部)指令接受匹配器符號,讓您可以過濾請求。 匹配器符號通常是選用的。 如果您在指令的語法中看到以下內容,則表示指令支援匹配器

[<matcher>]

因為匹配器符號的工作方式都相同,所以為了減少重複,不會在每個頁面上描述匹配器符號的各種可能性。 相反地,請參閱匹配器文件說明以取得語法的詳細說明。

指令順序

許多指令會操作 HTTP 處理器鏈。 這些指令的評估順序很重要,因此預設順序已硬編碼到 Caddy 中。

您可以使用order 全域選項route 指令來覆寫/自訂此順序。

tracing

map
vars
fs
root
log_append
log_skip
log_name

header
copy_response_headers # only in reverse_proxy's handle_response block
request_body

redir

# incoming request manipulation
method
rewrite
uri
try_files

# middleware handlers; some wrap responses
basic_auth
forward_auth
request_header
encode
push
intercept
templates

# special routing & dispatching directives
invoke
handle
handle_path
route

# handlers that typically respond to requests
abort
error
copy_response # only in reverse_proxy's handle_response block
respond
metrics
reverse_proxy
php_fastcgi
file_server
acme_server

排序演算法

為了易於使用,Caddyfile 轉接器會根據以下規則排序指令

  • 不同名稱的指令會根據它們在預設順序中的位置進行排序。 預設順序可以使用order 全域選項覆寫。 來自外掛程式的指令沒有順序,因此應使用order 全域選項或route 指令來設定一個順序。

  • 相同名稱的指令會根據它們的匹配器進行排序。

    • 最高優先權是具有單一路徑匹配器的指令。

      路徑匹配器按特異性排序,從最特定到最不特定。

      一般來說,這是透過按路徑匹配器的長度排序來執行的。 有一個例外情況,如果路徑以 * 結尾,並且兩個匹配器的路徑在其他方面相同,則沒有 * 的匹配器被認為更特定,並且排序更高。

      例如

      • /foobar/foo 更特定
      • /foo/foo* 更特定
      • /foo/*/foo* 更特定
    • 具有任何其他匹配器的指令會接下來排序,按照它在 Caddyfile 中出現的順序。

      這包括具有多個值的路徑匹配器,以及命名匹配器

    • 沒有匹配器(即匹配所有請求)的指令會最後排序。

  • vars 指令的匹配器排序已反轉,因為它涉及設定可能會互相覆寫的值,因此最特定的匹配器應最後評估。

  • route 指令的內容會忽略以上所有規則,並保留指令在其中出現的順序。