文件
一個 專案

Caddyfile 指令

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

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

指令 說明
abort 中止 HTTP 要求
acme_server 一個嵌入式 ACME 伺服器
basicauth 強制執行 HTTP 基本驗證
bind 自訂伺服器 Socket 位址
encode 編碼(通常會壓縮)回應
error 觸發錯誤
file_server 從磁碟提供檔案
forward_auth 委派驗證給外部服務
handle 指令的互斥群組
handle_errors 定義處理錯誤的路由
handle_path 類似於 handle,但會移除路徑前綴
header 設定或移除回應標頭
import 包含片段或檔案
invoke 呼叫命名路由
log 啟用存取/要求記錄
map 將輸入值對應到一個或多個輸出
method 內部變更 HTTP 方法
metrics 設定 Prometheus 指標展示端點
php_fastcgi 透過 FastCGI 提供 PHP 網站
push 使用 HTTP/2 伺服器推送將內容推播給客戶端
redir 對客戶端發出 HTTP 重新導向
request_body 操作要求主體
request_header 操作要求標頭
respond 寫入硬編碼回應給客戶端
reverse_proxy 強大且可擴充的反向代理
rewrite 內部改寫要求
root 設定網站根目錄的路徑
route 一組指令,被視為單一單元
skip_log 跳過對符合要求的存取記錄
templates 在回應中執行範本
tls 自訂 TLS 設定
tracing 與 OpenTelemetry 追蹤整合
try_files 依檔案是否存在而改寫
uri 操作 URI
vars 設定任意變數

語法

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

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

<carets> 指示要替換為實際值的代幣。

[brackets] 指示選用參數。

省略符號 ... 指示繼續,也就是一個或多個參數或列。

除非另有說明,否則子指令通常是選用的,即使它們未出現在 [brackets] 中。

比對器

大多數(但並非全部)指令接受比對器代碼,讓您過濾要求。比對器代碼通常是選用的。如果您在指令的語法中看到以下內容,表示該指令支援比對器

[<matcher>]

由於比對器代碼的運作方式相同,因此為了減少重複,不會在每個頁面上描述比對器代碼的各種可能性。請改為參閱比對器文件,以取得語法的詳細說明。

指令順序

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

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

tracing

map
vars
root
skip_log

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
basicauth
forward_auth
request_header
encode
push
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 指令的內容會忽略上述所有規則,並保留指令出現的順序。