找不到匹配的域名时可以指定默认域名、指定不匹配时的处理动作

This commit is contained in:
刘祥超
2020-11-18 12:17:50 +08:00
parent 850d343809
commit db770ab2a8
7 changed files with 157 additions and 30 deletions

View File

@@ -7,6 +7,7 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
) )
const ( const (
@@ -45,6 +46,14 @@ func (this *IndexAction) RunGet(params struct{}) {
func (this *IndexAction) RunPost(params struct { func (this *IndexAction) RunPost(params struct {
GlobalConfigJSON []byte GlobalConfigJSON []byte
Must *actions.Must Must *actions.Must
// 不匹配域名相关
AllowMismatchDomains []string
DomainMismatchAction string
DomainMismatchActionPageStatusCode int
DomainMismatchActionPageContentHTML string
DefaultDomain string
}) { }) {
// 创建日志 // 创建日志
this.CreateLog(oplogs.LevelInfo, "保存代理服务全局配置") this.CreateLog(oplogs.LevelInfo, "保存代理服务全局配置")
@@ -59,10 +68,44 @@ func (this *IndexAction) RunPost(params struct {
this.Fail("配置校验失败:" + err.Error()) this.Fail("配置校验失败:" + err.Error())
} }
// 允许不匹配的域名
allowMismatchDomains := []string{}
for _, domain := range params.AllowMismatchDomains {
if len(domain) > 0 {
allowMismatchDomains = append(allowMismatchDomains, domain)
}
}
globalConfig.HTTPAll.AllowMismatchDomains = allowMismatchDomains
// 不匹配域名的动作
switch params.DomainMismatchAction {
case "close":
globalConfig.HTTPAll.DomainMismatchAction = &serverconfigs.DomainMismatchAction{
Code: "close",
Options: nil,
}
case "page":
if params.DomainMismatchActionPageStatusCode <= 0 {
params.DomainMismatchActionPageStatusCode = 404
}
globalConfig.HTTPAll.DomainMismatchAction = &serverconfigs.DomainMismatchAction{
Code: "page",
Options: maps.Map{
"statusCode": params.DomainMismatchActionPageStatusCode,
"contentHTML": params.DomainMismatchActionPageContentHTML,
},
}
}
// 修改配置 // 修改配置
globalConfigJSON, err := json.Marshal(globalConfig)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().SysSettingRPC().UpdateSysSetting(this.AdminContext(), &pb.UpdateSysSettingRequest{ _, err = this.RPC().SysSettingRPC().UpdateSysSetting(this.AdminContext(), &pb.UpdateSysSettingRequest{
Code: SettingCodeServerGlobalConfig, Code: SettingCodeServerGlobalConfig,
ValueJSON: params.GlobalConfigJSON, ValueJSON: globalConfigJSON,
}) })
if err != nil { if err != nil {
this.ErrorPage(err) this.ErrorPage(err)

View File

@@ -1,5 +1,5 @@
Vue.component("values-box", { Vue.component("values-box", {
props: ["values", "size", "maxlength", "name"], props: ["values", "size", "maxlength", "name", "placeholder"],
data: function () { data: function () {
let values = this.values; let values = this.values;
if (values == null) { if (values == null) {
@@ -32,6 +32,10 @@ Vue.component("values-box", {
}, 200); }, 200);
}, },
confirm: function () { confirm: function () {
if (this.value.length == 0) {
return
}
if (this.isUpdating) { if (this.isUpdating) {
Vue.set(this.vValues, this.index, this.value); Vue.set(this.vValues, this.index, this.value);
} else { } else {
@@ -50,30 +54,31 @@ Vue.component("values-box", {
this.value = ""; this.value = "";
} }
}, },
template: '<div>\ template: `<div>
<div style="margin-bottom: 1em" v-if="vValues.length > 0">\ <div style="margin-bottom: 1em" v-if="vValues.length > 0">
<div class="ui label tiny" v-for="(value, index) in vValues" style="margin-top:0.4em;margin-bottom:0.4em">{{value}}\ <div class="ui label tiny" v-for="(value, index) in vValues" style="margin-top:0.4em;margin-bottom:0.4em">{{value}}
<input type="hidden" :name="name" :value="value"/>\ <input type="hidden" :name="name" :value="value"/>
&nbsp; <a href="" @click.prevent="update(index)" title="修改"><i class="icon pencil small" ></i></a> \ &nbsp; <a href="" @click.prevent="update(index)" title="修改"><i class="icon pencil small" ></i></a>
<a href="" @click.prevent="remove(index)" title="删除"><i class="icon remove"></i></a> \ <a href="" @click.prevent="remove(index)" title="删除"><i class="icon remove"></i></a>
</div> \ </div>
</div> \ <div class="ui divider"></div>
</div>
<!-- 添加|修改 -->\ <!-- 添加|修改 -->\
<div v-if="isAdding || isUpdating">\ <div v-if="isAdding || isUpdating">
<div class="ui fields inline">\ <div class="ui fields inline">
<div class="ui field">\ <div class="ui field">
<input type="text" :size="size" :maxlength="maxlength" v-model="value" ref="value" @keyup.enter="confirm()" @keypress.enter.prevent="1"/>\ <input type="text" :size="size" :maxlength="maxlength" :placeholder="placeholder" v-model="value" ref="value" @keyup.enter="confirm()" @keypress.enter.prevent="1"/>
</div> \ </div>
<div class="ui field">\ <div class="ui field">
<button class="ui button small" type="button" @click.prevent="confirm()">确定</button> \ <button class="ui button small" type="button" @click.prevent="confirm()">确定</button>
</div>\ </div>
<div class="ui field">\ <div class="ui field">
<a href="" @click.prevent="cancel()">取消</a> \ <a href="" @click.prevent="cancel()">取消</a>
</div> \ </div>
</div> \ </div>
</div> \ </div>
<div v-if="!isAdding && !isUpdating">\ <div v-if="!isAdding && !isUpdating">
<button class="ui button small" type="button" @click.prevent="create()">+</button> \ <button class="ui button small" type="button" @click.prevent="create()">+</button>
</div>\ </div>
</div>' </div>`
}); });

View File

@@ -28,4 +28,7 @@ table th.width10 {
table th.width5 { table th.width5 {
width: 5em; width: 5em;
} }
textarea::-webkit-scrollbar {
width: 6px !important;
}
/*# sourceMappingURL=@layout_override.css.map */ /*# sourceMappingURL=@layout_override.css.map */

View File

@@ -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,oCAAA;;AAGD,GAAG,OAAO,SAAU,MAAK,QAAS,OAAM;AAAS,GAAG,OAAO,SAAU,MAAK,QAAS,QAAO;EACzF,oCAAA;;AAGD,GAAG,MAAM;EACR,kCAAA;;AAID,IACC;EACC,2BAAA;;AAKF,KAAK;EACJ,sBAAA;;AAGD,KAAK,KAAK;EACT,yBAAA;;AAID,KACC,GAAE;AADH,KACY,GAAE;EACZ,6BAAA;;AAFF,KAKC,GAAE;EACD,WAAA;;AANF,KASC,GAAE;EACD,UAAA","file":"@layout_override.css"} {"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,oCAAA;;AAGD,GAAG,OAAO,SAAU,MAAK,QAAS,OAAM;AAAS,GAAG,OAAO,SAAU,MAAK,QAAS,QAAO;EACzF,oCAAA;;AAGD,GAAG,MAAM;EACR,kCAAA;;AAID,IACC;EACC,2BAAA;;AAKF,KAAK;EACJ,sBAAA;;AAGD,KAAK,KAAK;EACT,yBAAA;;AAID,KACC,GAAE;AADH,KACY,GAAE;EACZ,6BAAA;;AAFF,KAKC,GAAE;EACD,WAAA;;AANF,KASC,GAAE;EACD,UAAA;;AAKF,QAAQ;EACP,qBAAA","file":"@layout_override.css"}

View File

@@ -41,3 +41,8 @@ table {
width: 5em; width: 5em;
} }
} }
// textarea
textarea::-webkit-scrollbar {
width: 6px !important;
}

View File

@@ -9,13 +9,55 @@
<td colspan="2">HTTP/HTTPS通用设置</td> <td colspan="2">HTTP/HTTPS通用设置</td>
</tr> </tr>
<tr> <tr>
<td class="title">是否严格匹配域名</td> <td class="title color-border">是否严格匹配域名</td>
<td> <td>
<div class="ui checkbox"> <div class="ui checkbox">
<input type="checkbox" name="matchDomainStrictly" value="1" v-model="globalConfig.httpAll.matchDomainStrictly"/> <input type="checkbox" name="matchDomainStrictly" value="1" v-model="globalConfig.httpAll.matchDomainStrictly"/>
<label></label> <label></label>
</div> </div>
<p class="comment">如果选择了严格匹配域名,则没有在Edge里绑定过的域名访问时都会返回404</p> <p class="comment">如果选择了严格匹配域名,找不到匹配的域名时会采取对应的动作</p>
</td>
</tr>
<tr>
<td class="color-border">默认域名</td>
<td>
<input type="text" name="defaultDomain" v-model="globalConfig.httpAll.defaultDomain" maxlength="100"/>
<p class="comment">当找不到匹配的域名时,自动使用此域名。</p>
</td>
</tr>
<tr>
<td class="color-border">允许不匹配的域名</td>
<td>
<values-box :name="'allowMismatchDomains'" :values="globalConfig.httpAll.allowMismatchDomains" :size="40" :maxlength="100" :placeholder="'域名'"></values-box>
<p class="comment">允许这些域名即时不匹配也可以访问。</p>
</td>
</tr>
<tr>
<td class="color-border">域名不匹配时的动作</td>
<td>
<div class="ui checkbox radio">
<input type="radio" name="domainMismatchAction" value="close" v-model="domainMismatchAction"/>
<label>断开连接</label>
</div>
&nbsp;
<div class="ui checkbox radio">
<input type="radio" name="domainMismatchAction" value="page" v-model="domainMismatchAction"/>
<label>显示提示页面</label>
</div>
<p class="comment" v-if="domainMismatchAction == 'close'">当找不到要访问的域名时关闭客户端连接。</p>
<p class="comment" v-if="domainMismatchAction == 'page'">当找不到访问的域名时显示一个提示页面。</p>
</td>
</tr>
<tr v-if="domainMismatchAction == 'page'">
<td class="color-border">响应代码</td>
<td>
<input type="text" name="domainMismatchActionPageStatusCode" v-model="domainMismatchActionPageOptions.statusCode" style="width:4em" maxlength="3"/>
</td>
</tr>
<tr v-if="domainMismatchAction == 'page'">
<td class="color-border">域名不匹配时的动作页面</td>
<td>
<textarea name="domainMismatchActionPageContentHTML" v-model="domainMismatchActionPageOptions.contentHTML" rows="3"></textarea>
</td> </td>
</tr> </tr>
</table> </table>

View File

@@ -1,3 +1,32 @@
Tea.context(function () { Tea.context(function () {
this.success = NotifyReloadSuccess("保存成功") this.success = NotifyReloadSuccess("保存成功")
/**
* 域名不匹配动作
*/
this.domainMismatchAction = "page"
this.domainMismatchActionPageOptions = {
statusCode: 404,
contentHTML: `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>404 not found</title>
</head>
<body>
<h4>找不到您要访问的页面.</h4>
<h4>Sorry, page not found.</h4>
</body>
</html>
`
}
if (this.globalConfig.httpAll.domainMismatchAction != null) {
this.domainMismatchAction = this.globalConfig.httpAll.domainMismatchAction.code
if (this.domainMismatchAction == "page") {
this.domainMismatchActionPageOptions = this.globalConfig.httpAll.domainMismatchAction.options;
}
}
}) })