mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	缓存设置中可以设置缓存主域名,用来复用多域名下的缓存
This commit is contained in:
		@@ -53,12 +53,16 @@ func (this *IndexAction) RunPost(params struct {
 | 
				
			|||||||
	defer this.CreateLogInfo(codes.ServerCache_LogUpdateCacheSettings, params.WebId)
 | 
						defer this.CreateLogInfo(codes.ServerCache_LogUpdateCacheSettings, params.WebId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 校验配置
 | 
						// 校验配置
 | 
				
			||||||
	cacheConfig := &serverconfigs.HTTPCacheConfig{}
 | 
						var cacheConfig = &serverconfigs.HTTPCacheConfig{}
 | 
				
			||||||
	err := json.Unmarshal(params.CacheJSON, cacheConfig)
 | 
						err := json.Unmarshal(params.CacheJSON, cacheConfig)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		this.ErrorPage(err)
 | 
							this.ErrorPage(err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 分组不支持主域名
 | 
				
			||||||
 | 
						cacheConfig.Key = nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = cacheConfig.Init()
 | 
						err = cacheConfig.Init()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		this.Fail("检查配置失败:" + err.Error())
 | 
							this.Fail("检查配置失败:" + err.Error())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import (
 | 
				
			|||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
@@ -12,6 +13,7 @@ import (
 | 
				
			|||||||
	"github.com/iwind/TeaGo/actions"
 | 
						"github.com/iwind/TeaGo/actions"
 | 
				
			||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
	"github.com/iwind/TeaGo/types"
 | 
						"github.com/iwind/TeaGo/types"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type IndexAction struct {
 | 
					type IndexAction struct {
 | 
				
			||||||
@@ -92,6 +94,48 @@ func (this *IndexAction) RunPost(params struct {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查Key
 | 
				
			||||||
 | 
						if cacheConfig.Key != nil && cacheConfig.Key.IsOn {
 | 
				
			||||||
 | 
							if cacheConfig.Key.Scheme != "http" && cacheConfig.Key.Scheme != "https" {
 | 
				
			||||||
 | 
								this.Fail("缓存主域名协议只能是http或者https")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(cacheConfig.Key.Host) == 0 {
 | 
				
			||||||
 | 
								this.Fail("请输入缓存主域名")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							cacheConfig.Key.Host = strings.ToLower(strings.TrimSuffix(cacheConfig.Key.Host, "/"))
 | 
				
			||||||
 | 
							if !domainutils.ValidateDomainFormat(cacheConfig.Key.Host) {
 | 
				
			||||||
 | 
								this.Fail("请输入正确的缓存主域名")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 检查域名所属
 | 
				
			||||||
 | 
							serverIdResp, err := this.RPC().HTTPWebRPC().FindServerIdWithHTTPWebId(this.AdminContext(), &pb.FindServerIdWithHTTPWebIdRequest{HttpWebId: params.WebId})
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								this.ErrorPage(err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var serverId = serverIdResp.ServerId
 | 
				
			||||||
 | 
							if serverId <= 0 {
 | 
				
			||||||
 | 
								this.Fail("找不到要操作的网站")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							existServerNameResp, err := this.RPC().ServerRPC().CheckServerNameInServer(this.AdminContext(), &pb.CheckServerNameInServerRequest{
 | 
				
			||||||
 | 
								ServerId:   serverId,
 | 
				
			||||||
 | 
								ServerName: cacheConfig.Key.Host,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								this.ErrorPage(err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !existServerNameResp.Exists {
 | 
				
			||||||
 | 
								this.Fail("域名 '" + cacheConfig.Key.Host + "' 在当前网站中并未绑定,不能作为缓存主域名")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = cacheConfig.Init()
 | 
						err = cacheConfig.Init()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		this.Fail("检查配置失败:" + err.Error())
 | 
							this.Fail("检查配置失败:" + err.Error())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import (
 | 
				
			|||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
@@ -11,6 +12,7 @@ import (
 | 
				
			|||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
 | 
				
			||||||
	"github.com/iwind/TeaGo/actions"
 | 
						"github.com/iwind/TeaGo/actions"
 | 
				
			||||||
	"github.com/iwind/TeaGo/maps"
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type IndexAction struct {
 | 
					type IndexAction struct {
 | 
				
			||||||
@@ -71,12 +73,55 @@ func (this *IndexAction) RunPost(params struct {
 | 
				
			|||||||
	defer this.CreateLogInfo(codes.ServerCache_LogUpdateCacheSettings, params.WebId)
 | 
						defer this.CreateLogInfo(codes.ServerCache_LogUpdateCacheSettings, params.WebId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 校验配置
 | 
						// 校验配置
 | 
				
			||||||
	cacheConfig := &serverconfigs.HTTPCacheConfig{}
 | 
						var cacheConfig = &serverconfigs.HTTPCacheConfig{}
 | 
				
			||||||
	err := json.Unmarshal(params.CacheJSON, cacheConfig)
 | 
						err := json.Unmarshal(params.CacheJSON, cacheConfig)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		this.ErrorPage(err)
 | 
							this.ErrorPage(err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查Key
 | 
				
			||||||
 | 
						if cacheConfig.Key != nil && cacheConfig.Key.IsOn {
 | 
				
			||||||
 | 
							if cacheConfig.Key.Scheme != "http" && cacheConfig.Key.Scheme != "https" {
 | 
				
			||||||
 | 
								this.Fail("缓存主域名协议只能是http或者https")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(cacheConfig.Key.Host) == 0 {
 | 
				
			||||||
 | 
								this.Fail("请输入缓存主域名")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							cacheConfig.Key.Host = strings.ToLower(strings.TrimSuffix(cacheConfig.Key.Host, "/"))
 | 
				
			||||||
 | 
							if !domainutils.ValidateDomainFormat(cacheConfig.Key.Host) {
 | 
				
			||||||
 | 
								this.Fail("请输入正确的缓存主域名")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 检查域名所属
 | 
				
			||||||
 | 
							serverIdResp, err := this.RPC().HTTPWebRPC().FindServerIdWithHTTPWebId(this.AdminContext(), &pb.FindServerIdWithHTTPWebIdRequest{HttpWebId: params.WebId})
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								this.ErrorPage(err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var serverId = serverIdResp.ServerId
 | 
				
			||||||
 | 
							if serverId <= 0 {
 | 
				
			||||||
 | 
								this.Fail("找不到要操作的网站")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							existServerNameResp, err := this.RPC().ServerRPC().CheckServerNameInServer(this.AdminContext(), &pb.CheckServerNameInServerRequest{
 | 
				
			||||||
 | 
								ServerId:   serverId,
 | 
				
			||||||
 | 
								ServerName: cacheConfig.Key.Host,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								this.ErrorPage(err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !existServerNameResp.Exists {
 | 
				
			||||||
 | 
								this.Fail("域名 '" + cacheConfig.Key.Host + "' 在当前网站中并未绑定,不能作为缓存主域名")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = cacheConfig.Init()
 | 
						err = cacheConfig.Init()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		this.Fail("检查配置失败:" + err.Error())
 | 
							this.Fail("检查配置失败:" + err.Error())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,11 +19,21 @@ Vue.component("http-cache-config-box", {
 | 
				
			|||||||
			cacheConfig.cacheRefs = []
 | 
								cacheConfig.cacheRefs = []
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var maxBytes = null
 | 
							let maxBytes = null
 | 
				
			||||||
		if (this.vCachePolicy != null && this.vCachePolicy.maxBytes != null) {
 | 
							if (this.vCachePolicy != null && this.vCachePolicy.maxBytes != null) {
 | 
				
			||||||
			maxBytes = this.vCachePolicy.maxBytes
 | 
								maxBytes = this.vCachePolicy.maxBytes
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// key
 | 
				
			||||||
 | 
							if (cacheConfig.key == null) {
 | 
				
			||||||
 | 
								// use Vue.set to activate vue events
 | 
				
			||||||
 | 
								Vue.set(cacheConfig, "key", {
 | 
				
			||||||
 | 
									isOn: false,
 | 
				
			||||||
 | 
									scheme: "https",
 | 
				
			||||||
 | 
									host: ""
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			cacheConfig: cacheConfig,
 | 
								cacheConfig: cacheConfig,
 | 
				
			||||||
			moreOptionsVisible: false,
 | 
								moreOptionsVisible: false,
 | 
				
			||||||
@@ -31,7 +41,9 @@ Vue.component("http-cache-config-box", {
 | 
				
			|||||||
			maxBytes: maxBytes,
 | 
								maxBytes: maxBytes,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			searchBoxVisible: false,
 | 
								searchBoxVisible: false,
 | 
				
			||||||
			searchKeyword: ""
 | 
								searchKeyword: "",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								keyOptionsVisible: false
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	watch: {
 | 
						watch: {
 | 
				
			||||||
@@ -106,6 +118,44 @@ Vue.component("http-cache-config-box", {
 | 
				
			|||||||
				</td>
 | 
									</td>
 | 
				
			||||||
			</tr>
 | 
								</tr>
 | 
				
			||||||
		</tbody>
 | 
							</tbody>
 | 
				
			||||||
 | 
							<tbody v-show="isOn() && !vIsGroup">
 | 
				
			||||||
 | 
								<tr>
 | 
				
			||||||
 | 
									<td>缓存主域名</td>
 | 
				
			||||||
 | 
									<td>
 | 
				
			||||||
 | 
										<div v-show="!cacheConfig.key.isOn">默认   <a href="" @click.prevent="keyOptionsVisible = !keyOptionsVisible"><span class="small">[修改]</span></a></div>
 | 
				
			||||||
 | 
										<div v-show="cacheConfig.key.isOn">使用主域名:{{cacheConfig.key.scheme}}://{{cacheConfig.key.host}}    <a href="" @click.prevent="keyOptionsVisible = !keyOptionsVisible"><span class="small">[修改]</span></a></div>
 | 
				
			||||||
 | 
										<div v-show="keyOptionsVisible" style="margin-top: 1em">
 | 
				
			||||||
 | 
											<div class="ui divider"></div>
 | 
				
			||||||
 | 
											<table class="ui table definition">
 | 
				
			||||||
 | 
												<tr>
 | 
				
			||||||
 | 
													<td class="title">启用主域名</td>
 | 
				
			||||||
 | 
													<td><checkbox v-model="cacheConfig.key.isOn"></checkbox>
 | 
				
			||||||
 | 
														<p class="comment">启用主域名后,所有缓存键值中的协议和域名部分都会修改为主域名,用来实现缓存不区分域名。</p>
 | 
				
			||||||
 | 
													</td>
 | 
				
			||||||
 | 
												</tr>	
 | 
				
			||||||
 | 
												<tr v-show="cacheConfig.key.isOn">
 | 
				
			||||||
 | 
													<td>主域名 *</td>
 | 
				
			||||||
 | 
													<td>
 | 
				
			||||||
 | 
														<div class="ui fields inline">
 | 
				
			||||||
 | 
															<div class="ui field">
 | 
				
			||||||
 | 
																<select class="ui dropdown" v-model="cacheConfig.key.scheme">
 | 
				
			||||||
 | 
																	<option value="https">https://</option>
 | 
				
			||||||
 | 
																	<option value="http">http://</option>
 | 
				
			||||||
 | 
																</select>
 | 
				
			||||||
 | 
															</div>
 | 
				
			||||||
 | 
															<div class="ui field">
 | 
				
			||||||
 | 
																<input type="text" v-model="cacheConfig.key.host" placeholder="example.com" @keyup.enter="keyOptionsVisible = false" @keypress.enter.prevent="1"/>
 | 
				
			||||||
 | 
															</div>
 | 
				
			||||||
 | 
														</div>
 | 
				
			||||||
 | 
														<p class="comment">此域名<strong>必须</strong>是当前网站已绑定域名,在刷新缓存时也需要使用此域名。</p>
 | 
				
			||||||
 | 
													</td>
 | 
				
			||||||
 | 
												</tr>
 | 
				
			||||||
 | 
											</table>
 | 
				
			||||||
 | 
											<button class="ui button tiny" type="button" @click.prevent="keyOptionsVisible = false">完成</button>
 | 
				
			||||||
 | 
										</div>
 | 
				
			||||||
 | 
									</td>
 | 
				
			||||||
 | 
								</tr>
 | 
				
			||||||
 | 
							</tbody>
 | 
				
			||||||
		<tbody v-show="isOn()">
 | 
							<tbody v-show="isOn()">
 | 
				
			||||||
			<tr>
 | 
								<tr>
 | 
				
			||||||
				<td colspan="2">
 | 
									<td colspan="2">
 | 
				
			||||||
@@ -164,6 +214,11 @@ Vue.component("http-cache-config-box", {
 | 
				
			|||||||
		<http-cache-stale-config :v-cache-stale-config="cacheConfig.stale" @change="changeStale"></http-cache-stale-config>
 | 
							<http-cache-stale-config :v-cache-stale-config="cacheConfig.stale" @change="changeStale"></http-cache-stale-config>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						<div v-show="isOn()">
 | 
				
			||||||
 | 
							<submit-btn></submit-btn>
 | 
				
			||||||
 | 
							<div class="ui divider"></div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	<div v-show="isOn()" style="margin-top: 1em">
 | 
						<div v-show="isOn()" style="margin-top: 1em">
 | 
				
			||||||
		<h4 style="position: relative">缓存条件   <a href="" style="font-size: 0.8em" @click.prevent="$refs.cacheRefsConfigBoxRef.addRef(false)">[添加]</a>   <a href="" style="font-size: 0.8em" @click.prevent="showSearchBox" v-show="!searchBoxVisible">[搜索]</a> 
 | 
							<h4 style="position: relative">缓存条件   <a href="" style="font-size: 0.8em" @click.prevent="$refs.cacheRefsConfigBoxRef.addRef(false)">[添加]</a>   <a href="" style="font-size: 0.8em" @click.prevent="showSearchBox" v-show="!searchBoxVisible">[搜索]</a> 
 | 
				
			||||||
			<div class="ui input small right labeled" style="position: absolute; top: -0.4em; margin-left: 0.5em; zoom: 0.9" v-show="searchBoxVisible">
 | 
								<div class="ui input small right labeled" style="position: absolute; top: -0.4em; margin-left: 0.5em; zoom: 0.9" v-show="searchBoxVisible">
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user