Astro Cloudflare 為什麼有 SESSION KV?用 session: false 關掉不需要的狀態
使用 @astrojs/cloudflare 部署 Astro 的 server-rendered 網站時,看到 SESSION KV binding 不一定代表你寫錯設定。Cloudflare adapter 會為 Astro Sessions 自動準備 Workers KV,預設 binding 名稱是 SESSION;如果部署環境會自動 provision KV,就可能在 Wrangler 設定或部署輸出中看到它。
直接結論是:**沒有使用 Astro.session、Actions 或其他需要跨 request 狀態的功能,可以在 astro.config.mjs 設定 session: false;確實需要 session 時,保留 adapter 的預設 SESSION,或用 sessionKVBindingName 與 Wrangler 的 KV binding 名稱對齊。**純靜態網站本來就不需要 Cloudflare adapter,先分清楚輸出模式再改設定。
SESSION 是哪裡來的
Astro Sessions 用來在不同 request 之間保存使用者資料,例如偏好、購物車或登入相關狀態。Cloudflare adapter 會替這個功能接上 Workers KV;預設 binding 名稱為 SESSION,部署時可由 Wrangler 自動 provision,也可以在 wrangler.jsonc 手動宣告。
這和「網站是不是放在 Cloudflare」不是同一個判斷。Astro 官方 adapter 文件指出,若只是把 Astro 當成靜態網站產生器,不需要 adapter;只有要部署 on-demand rendering、server islands、Actions 或 Sessions 等 server 功能時,才需要對應的 adapter。可以先用這個命令確認專案實際是否引用 session:
rg -n 'Astro\.session|session\.|sessionDrivers|actions|output:|@astrojs/cloudflare' \ astro.config.mjs src package.json wrangler.jsonc搜尋結果不能單獨證明 runtime 沒有狀態,但能先把「真的使用 session」和「adapter 預設接線」分開。若只是想把網站部署到 Cloudflare 的 static assets,應先檢查是否能移除 adapter,而不是只把 KV 名稱改掉。
純靜態或無 session 網站設定 session: false
Astro 7.2.0 起,Sessions 可以在全域設定中關閉。false 不只是忽略某個 API,而是讓 session runtime 不進 SSR bundle,adapter 也跳過預設 session driver 的接線:
import { defineConfig } from 'astro/config'import cloudflare from '@astrojs/cloudflare'
export default defineConfig({ output: 'server', session: false, adapter: cloudflare(),})這個範例仍保留 output: 'server' 與 Cloudflare adapter,適合「需要 server rendering,但不需要跨 request session」的網站。若專案其實是完整靜態輸出,應另外依 Astro 7 升級與建置清單 檢查 output、integration 與產出路徑,不要把 session: false 誤當成移除 adapter 的替代方案。
設定後要同步檢查兩邊:
pnpm checkpnpm buildrg -n 'SESSION|session|kv_namespaces' dist .astro astro.config.mjs wrangler.jsoncdist 或 .astro 的實際輸出位置會依 adapter 與 Astro 版本不同;搜尋是用來找出是否仍有 session driver 或 binding 的線索,不應把「搜尋不到字串」當成完整 runtime 測試。若 build 仍報出 Astro.session 相關錯誤,回頭檢查是否有元件或 integration 真的讀取該 API。
確實使用 session 時,保留或改名 binding
如果頁面會使用 Astro.session?.get()、set() 或 regenerate(),不要為了讓設定檔看起來乾淨就關掉 Sessions。最簡單的做法是接受預設名稱:
export default defineConfig({ adapter: cloudflare(),})如果既有 Wrangler 設定使用另一個 binding 名稱,則要讓 adapter option 和 wrangler.jsonc 完全一致:
export default defineConfig({ adapter: cloudflare({ sessionKVBindingName: 'MY_SESSION_BINDING', }),}){ "kv_namespaces": [ { "binding": "MY_SESSION_BINDING" } ]}只改 Astro 設定、不改 Wrangler binding,或反過來只改 KV 名稱,都可能讓部署後的 runtime 找不到相同的 binding。這類問題通常不是 build 語法錯誤,而是 Worker 執行時的環境連線錯誤,所以要把本機 build 與實際 preview/部署分開驗證。
用程式搜尋確認是否真的需要 session
關閉前可用三個層次盤點:
- 直接搜尋
Astro.session、sessionDrivers與自訂 middleware,確認頁面或 endpoint 是否讀寫狀態。 - 檢查 adapter、integration 與 server islands 是否依賴 Sessions;不要只看
src/pages。 - 用測試或手動請求驗證登入、購物車、偏好設定等跨 request 行為是否存在。
若只找到文件、型別或未使用的舊元件,可以先移除死程式碼,再設定 session: false。若網站依賴 cookie 來保存小型非敏感 UI 狀態,也不代表一定要使用 Astro Sessions;但驗證時要分清楚 cookie、KV session 與 Cloudflare binding 是三種不同的資料邊界。
最後用部署邊界驗證,而不是只看 build
完成設定後,至少記錄以下結果:
pnpm check與pnpm build通過。- 專案中沒有仍會執行的
Astro.session呼叫,或已確認它們保留並使用正確 binding。 session: false的專案不會把 session 當成必要 runtime;保留 Sessions 的專案則在 Wrangler 設定中有相同的 KV binding 名稱。- preview 與正式 Worker 的登入、跨 request 資料與錯誤處理符合預期。
如果只是為了消除一個 SESSION 設定提示,先不要直接刪掉 KV。先確認是否是 adapter 的預設行為、是否是既有 session 功能,並把這次變更和 Cloudflare 的部署設定一起 review,才能避免「build 乾淨、上線後狀態遺失」的回歸。
常見問題
Q: 看到 SESSION KV 就代表網站一定用了使用者 session 嗎?
A: 不一定。Cloudflare adapter 會自動替 Astro Sessions 接上 Workers KV,所以即使目前沒有呼叫 Astro.session,也可能看到預設的 SESSION binding。先搜尋實際使用情況;若確定不需要,可用 Astro 7.2.0 以上的 session: false 關閉預設接線。
Q: session: false 可以寫在 cloudflare() 裡嗎?
A: 這個選項是 Astro 的頂層 session 設定,不是 @astrojs/cloudflare 的 sessionKVBindingName。前者用來關閉或設定 Astro Sessions;後者只是在仍使用 session 時指定 KV binding 名稱。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。