# ⚡ 提供 HTTP/3 HTTP/3 預設開啟:除非全域協定清單排除了 `h3`,否則 HTTPS 網站都會在 UDP 443 啟用 QUIC 監聽器。請檢查回應使用的協定版本;用戶端可能在 HTTP/3 連線失敗後改用 HTTP/2。 📌 本頁描述 **v0.2.2**。 ## 🧾 開始之前 - 一個解析到這台主機的名稱,以及它的憑證([HTTPS](/zh-TW/start/https/))。 - 在供應商與主機的防火牆上都 **開放 UDP 443**。UDP 被擋住時,用戶端可能改用 HTTP/2。 - 支援 HTTP/3 的用戶端。多數發行版內建的 `curl` 不支援 HTTP/3,執行時會顯示下列錯誤: ```text curl: option --http3: the installed libcurl version doesn't support this ``` ## 🔌 開啟 ```caddyfile { email bonjour@pingclair.com servers { protocols h1 h2 h3 } } example.com { file_server /srv/site } ``` 網站啟動後,在主機上檢查 UDP 監聽器: ```bash sudo ss -lunp | grep ':443 ' ``` ```text UNCONN 0 0 *:443 *:* users:(("pingclair",pid=5425,fd=22)) ``` 從清單中移除 `h3`,這個監聽器就會消失;這份清單就是開關([TLS:可以調整什麼](/zh-TW/guides/tls-tuning/#-提供哪些協定))。沒有 `protocols` 這一行時,HTTP/3 維持開啟。 `tls` 區塊也接受個別網站的開關: ```caddyfile example.com { tls { http3 off } file_server /srv/site } ``` `http3 off` 會拒絕該網站的 QUIC 握手,並停止在 `Alt-Svc` 宣告 HTTP/3。同一連接埠的其他網站仍可使用 QUIC。 ## ✅ 證明用戶端用了它 證據要從用戶端取得。任何以 ngtcp2 或 quiche 建置的 curl 都可以;在 curl 不支援 HTTP/3 的主機上,用容器是取得它最快的方式: ```bash docker run --rm --network host \ ymuski/curl-http3 curl -sI --http3 https://example.com/ ``` ```text curl 8.2.1-DEV (x86_64-pc-linux-gnu) libcurl/8.2.1-DEV BoringSSL zlib/1.2.13 nghttp2/1.52.0 quiche/0.18.0 ``` `--network host` 讓容器直接使用主機的網路。少了它,請求可能會經過一個擋掉 QUIC 的網路命名空間。 ```text HTTP/3 200 content-type: text/html; charset=utf-8 etag: "5e-6ab20622" accept-ranges: bytes x-served-by: pingclair server: Pingclair ``` 答案就在第一行:狀態列寫的是 `HTTP/3`,而不是 `HTTP/2`。對同一個 URL 分別用 `--http2` 與 `--http1.1` 請求,會顯示另外兩種協定,這就確認了用戶端沒有退回。 沒有容器可用時,若系統的 OpenSSL 是 3.5 或更新版本,可以用它檢查 QUIC 交握: ```bash openssl s_client -quic -alpn h3 -connect example.com:443 -servername example.com