diff --git a/internal/web/actions/default/servers/server/settings/cache/init.go b/internal/web/actions/default/servers/server/settings/cache/init.go
index f7f0bfab..9a814079 100644
--- a/internal/web/actions/default/servers/server/settings/cache/init.go
+++ b/internal/web/actions/default/servers/server/settings/cache/init.go
@@ -17,6 +17,7 @@ func init() {
 			GetPost("/createPopup", new(CreatePopupAction)).
 			GetPost("/purge", new(PurgeAction)).
 			GetPost("/preheat", new(PreheatAction)).
+			Post("/updateRefs", new(UpdateRefsAction)).
 			EndAll()
 	})
 }
diff --git a/internal/web/actions/default/servers/server/settings/cache/updateRefs.go b/internal/web/actions/default/servers/server/settings/cache/updateRefs.go
new file mode 100644
index 00000000..34178def
--- /dev/null
+++ b/internal/web/actions/default/servers/server/settings/cache/updateRefs.go
@@ -0,0 +1,83 @@
+// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
+
+package cache
+
+import (
+	"encoding/json"
+	"errors"
+	"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
+	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
+)
+
+type UpdateRefsAction struct {
+	actionutils.ParentAction
+}
+
+func (this *UpdateRefsAction) RunPost(params struct {
+	WebId    int64
+	RefsJSON []byte
+}) {
+	// 日志
+	defer this.CreateLog(oplogs.LevelInfo, "修改Web %d 的缓存设置", params.WebId)
+
+	this.Data["isUpdated"] = false
+
+	webConfigResp, err := this.RPC().HTTPWebRPC().FindEnabledHTTPWebConfig(this.AdminContext(), &pb.FindEnabledHTTPWebConfigRequest{HttpWebId: params.WebId})
+	if err != nil {
+		this.ErrorPage(err)
+		return
+	}
+	var webConfig = &serverconfigs.HTTPWebConfig{}
+	err = json.Unmarshal(webConfigResp.HttpWebJSON, webConfig)
+	if err != nil {
+		this.ErrorPage(err)
+		return
+	}
+
+	this.Data["webId"] = webConfig.Id
+	this.Data["cacheConfig"] = webConfig.Cache
+
+	// 校验配置
+	var cacheConfig = webConfig.Cache
+	if webConfig == nil {
+		this.Success()
+	}
+
+	var refs = []*serverconfigs.HTTPCacheRef{}
+	err = json.Unmarshal(params.RefsJSON, &refs)
+	if err != nil {
+		this.ErrorPage(errors.New("decode refs json failed: " + err.Error()))
+		return
+	}
+	cacheConfig.CacheRefs = refs
+
+	err = cacheConfig.Init()
+	if err != nil {
+		this.Fail("检查配置失败:" + err.Error())
+	}
+
+	// 去除不必要的部分
+	for _, cacheRef := range cacheConfig.CacheRefs {
+		cacheRef.CachePolicy = nil
+	}
+
+	cacheJSON, err := json.Marshal(cacheConfig)
+	if err != nil {
+		this.ErrorPage(err)
+		return
+	}
+
+	_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebCache(this.AdminContext(), &pb.UpdateHTTPWebCacheRequest{
+		HttpWebId: params.WebId,
+		CacheJSON: cacheJSON,
+	})
+	if err != nil {
+		this.ErrorPage(err)
+		return
+	}
+
+	this.Data["isUpdated"] = true
+	this.Success()
+}
diff --git a/web/public/js/components/server/http-cache-config-box.js b/web/public/js/components/server/http-cache-config-box.js
index be169dab..38988d77 100644
--- a/web/public/js/components/server/http-cache-config-box.js
+++ b/web/public/js/components/server/http-cache-config-box.js
@@ -1,5 +1,5 @@
 Vue.component("http-cache-config-box", {
-	props: ["v-cache-config", "v-is-location", "v-is-group", "v-cache-policy"],
+	props: ["v-cache-config", "v-is-location", "v-is-group", "v-cache-policy", "v-web-id"],
 	data: function () {
 		let cacheConfig = this.vCacheConfig
 		if (cacheConfig == null) {
@@ -138,7 +138,7 @@ Vue.component("http-cache-config-box", {
 	
 	
 		
缓存条件
-		
+		
 	
 	
 `
diff --git a/web/public/js/components/server/http-cache-refs-box.js b/web/public/js/components/server/http-cache-refs-box.js
index 24b09451..611459f2 100644
--- a/web/public/js/components/server/http-cache-refs-box.js
+++ b/web/public/js/components/server/http-cache-refs-box.js
@@ -42,8 +42,8 @@ Vue.component("http-cache-refs-box", {
 					缓存时间 | 
 				
 				
-					| 
-						
+					 | 
+						
 						
 							{{cacheRef.minSize.count}}{{cacheRef.minSize.unit}}
 							- {{cacheRef.maxSize.count}}{{cacheRef.maxSize.unit}}
@@ -54,11 +54,11 @@ Vue.component("http-cache-refs-box", {
 						状态码:{{cacheRef.status.map(function(v) {return v.toString()}).join(", ")}}
 						区间缓存
 					 | 
-					
+					 | 
 						和
 						或
 					 | 
-					
+					 | 
 						{{cacheRef.life.count}} {{timeUnitName(cacheRef.life.unit)}}
 						不缓存
 					 | 
diff --git a/web/public/js/components/server/http-cache-refs-config-box.js b/web/public/js/components/server/http-cache-refs-config-box.js
index b81eda76..03e11652 100644
--- a/web/public/js/components/server/http-cache-refs-config-box.js
+++ b/web/public/js/components/server/http-cache-refs-config-box.js
@@ -1,5 +1,5 @@
 Vue.component("http-cache-refs-config-box", {
-	props: ["v-cache-refs", "v-cache-config", "v-cache-policy-id"],
+	props: ["v-cache-refs", "v-cache-config", "v-cache-policy-id", "v-web-id"],
 	mounted: function () {
 		let that = this
 		sortTable(function (ids) {
@@ -101,6 +101,14 @@ Vue.component("http-cache-refs-config-box", {
 				}
 			})
 		},
+		disableRef: function (ref) {
+			ref.isOn = false
+			this.change()
+		},
+		enableRef: function (ref) {
+			ref.isOn = true
+			this.change()
+		},
 		removeRef: function (index) {
 			let that = this
 			teaweb.confirm("确定要删除此缓存设置吗?", function () {
@@ -133,13 +141,25 @@ Vue.component("http-cache-refs-config-box", {
 		},
 		change: function () {
 			// 自动保存
-			if (this.vCachePolicyId != null && this.vCachePolicyId > 0) {
+			if (this.vCachePolicyId != null && this.vCachePolicyId > 0) { // 缓存策略
 				Tea.action("/servers/components/cache/updateRefs")
 					.params({
 						cachePolicyId: this.vCachePolicyId,
 						refsJSON: JSON.stringify(this.refs)
 					})
 					.post()
+			} else if (this.vWebId != null && this.vWebId > 0) { // Server Web or Group Web
+				Tea.action("/servers/server/settings/cache/updateRefs")
+					.params({
+						webId: this.vWebId,
+						refsJSON: JSON.stringify(this.refs)
+					})
+					.success(function (resp) {
+						if (resp.data.isUpdated) {
+							teaweb.successToast("保存成功")
+						}
+					})
+					.post()
 			}
 		}
 	},
@@ -155,14 +175,14 @@ Vue.component("http-cache-refs-config-box", {
 					缓存条件 | 
 					分组关系 | 
 					缓存时间 | 
-					操作 | 
+					操作 | 
 				
 				
 			
 				
 					|   | 
-					
-						
+					 | 
+						
 						
 							{{cacheRef.minSize.count}}{{cacheRef.minSize.unit}}
 							- {{cacheRef.maxSize.count}}{{cacheRef.maxSize.unit}}
@@ -173,16 +193,17 @@ Vue.component("http-cache-refs-config-box", {
 						状态码:{{cacheRef.status.map(function(v) {return v.toString()}).join(", ")}}
 						区间缓存
 					 | 
-					
+					 | 
 						和
 						或
 					 | 
-					
+					 | 
 						{{cacheRef.life.count}} {{timeUnitName(cacheRef.life.unit)}}
 						不缓存
 					 | 
 					
 						修改  
+						暂停恢复  
 						删除
 					 | 
 				
diff --git a/web/views/@default/@layout_override.css b/web/views/@default/@layout_override.css
index 53b9391f..6b09eb7f 100644
--- a/web/views/@default/@layout_override.css
+++ b/web/views/@default/@layout_override.css
@@ -12,6 +12,9 @@
 .ui.label.basic.grey {
   border: 1px #ccc solid !important;
 }
+.disabled .ui.label {
+  color: #ccc !important;
+}
 form .fields {
   margin-bottom: 0 !important;
 }
@@ -49,7 +52,7 @@ body.swal2-shown {
   overflow: auto !important;
 }
 .grid {
-  margin-right: 0!important;
+  margin-right: 0 !important;
 }
 .fields button {
   min-width: 5em;
diff --git a/web/views/@default/@layout_override.css.map b/web/views/@default/@layout_override.css.map
index dace5f21..2dc51bf4 100644
--- a/web/views/@default/@layout_override.css.map
+++ b/web/views/@default/@layout_override.css.map
@@ -1 +1 @@
-{"version":3,"sources":["@layout_override.less"],"names":[],"mappings":"AACA,GAAG,OAAO,SAAU,MAAK,MAAM,QAAS,OAAM;AAAS,GAAG,OAAO,SAAU,MAAK,MAAM,QAAS,QAAO;EACrG,yBAAA;;AAGD,GAAG,OAAO,SAAU,MAAK,QAAS,OAAM;AAAS,GAAG,OAAO,SAAU,MAAK,QAAS,QAAO;EACzF,yBAAA;;AAGD,GAAG,MAAM;EACR,kCAAA;;AAGD,GAAG,MAAM,MAAM;EACd,sBAAA;;AAID,IACC;EACC,2BAAA;;AAKF,KAAK;EACJ,sBAAA;;AAGD,KAAK,KAAK;EACT,cAAA;;AAID,KACC,GAAE;AADH,KACY,GAAE;EACZ,6BAAA;EACA,0BAAA;EACA,2BAAA;;AAJF,KAOC,GAAE;EACD,WAAA;;AARF,KAWC,GAAE;EACD,UAAA;;AAZF,KAeC,GAAE;EACD,UAAA;;AAKF,QAAQ;EACP,qBAAA;;AAID,MAAM;EACL,uBAAA;;AAID,QACC,MAAK;EACJ,yBAAA;;AAKF,IAAI;EACH,yBAAA;;AAID;EACC,yBAAA;;AAID,OACC;EACC,cAAA","file":"@layout_override.css"}
\ No newline at end of file
+{"version":3,"sources":["@layout_override.less"],"names":[],"mappings":"AACA,GAAG,OAAO,SAAU,MAAK,MAAM,QAAS,OAAM;AAAS,GAAG,OAAO,SAAU,MAAK,MAAM,QAAS,QAAO;EACrG,yBAAA;;AAGD,GAAG,OAAO,SAAU,MAAK,QAAS,OAAM;AAAS,GAAG,OAAO,SAAU,MAAK,QAAS,QAAO;EACzF,yBAAA;;AAGD,GAAG,MAAM;EACR,kCAAA;;AAGD,GAAG,MAAM,MAAM;EACd,sBAAA;;AAGD,SAAU,IAAG;EACZ,WAAA;;AAID,IACC;EACC,2BAAA;;AAKF,KAAK;EACJ,sBAAA;;AAGD,KAAK,KAAK;EACT,cAAA;;AAID,KACC,GAAE;AADH,KACY,GAAE;EACZ,6BAAA;EACA,0BAAA;EACA,2BAAA;;AAJF,KAOC,GAAE;EACD,WAAA;;AARF,KAWC,GAAE;EACD,UAAA;;AAZF,KAeC,GAAE;EACD,UAAA;;AAKF,QAAQ;EACP,qBAAA;;AAID,MAAM;EACL,uBAAA;;AAID,QACC,MAAK;EACJ,yBAAA;;AAKF,IAAI;EACH,yBAAA;;AAID;EACC,0BAAA;;AAID,OACC;EACC,cAAA","file":"@layout_override.css"}
\ No newline at end of file
diff --git a/web/views/@default/@layout_override.less b/web/views/@default/@layout_override.less
index db994e9a..81758162 100644
--- a/web/views/@default/@layout_override.less
+++ b/web/views/@default/@layout_override.less
@@ -15,6 +15,10 @@
 	border: 1px #ccc solid !important;
 }
 
+.disabled .ui.label {
+	color: #ccc !important;
+}
+
 // fields
 form {
 	.fields {
@@ -76,7 +80,7 @@ body.swal2-shown {
 
 // grid
 .grid {
-	margin-right: 0!important;
+	margin-right: 0 !important;
 }
 
 // fields
diff --git a/web/views/@default/servers/server/settings/cache/index.html b/web/views/@default/servers/server/settings/cache/index.html
index a54ee449..20b0a3f0 100644
--- a/web/views/@default/servers/server/settings/cache/index.html
+++ b/web/views/@default/servers/server/settings/cache/index.html
@@ -13,7 +13,7 @@