diff --git a/internal/web/actions/default/servers/server/settings/redirects/createPopup.go b/internal/web/actions/default/servers/server/settings/redirects/createPopup.go index 278c3dd7..e1d61c98 100644 --- a/internal/web/actions/default/servers/server/settings/redirects/createPopup.go +++ b/internal/web/actions/default/servers/server/settings/redirects/createPopup.go @@ -6,6 +6,7 @@ import ( "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" "net/url" + "regexp" ) type CreatePopupAction struct { @@ -27,6 +28,7 @@ func (this *CreatePopupAction) RunPost(params struct { BeforeURL string AfterURL string MatchPrefix bool + MatchRegexp bool KeepRequestURI bool Status int @@ -39,7 +41,12 @@ func (this *CreatePopupAction) RunPost(params struct { Require("请填写跳转前的URL") // 校验格式 - { + if params.MatchRegexp { + _, err := regexp.Compile(params.BeforeURL) + if err != nil { + this.Fail("跳转前URL正则表达式错误:" + err.Error()) + } + } else { u, err := url.Parse(params.BeforeURL) if err != nil { this.FailField("beforeURL", "请输入正确的跳转前URL") @@ -56,7 +63,9 @@ func (this *CreatePopupAction) RunPost(params struct { Require("请填写跳转后URL") // 校验格式 - { + if params.MatchRegexp { + // 正则表达式情况下不做校验 + } else { u, err := url.Parse(params.AfterURL) if err != nil { this.FailField("afterURL", "请输入正确的跳转后URL") @@ -76,6 +85,7 @@ func (this *CreatePopupAction) RunPost(params struct { "beforeURL": params.BeforeURL, "afterURL": params.AfterURL, "matchPrefix": params.MatchPrefix, + "matchRegexp": params.MatchRegexp, "keepRequestURI": params.KeepRequestURI, "isOn": true, } diff --git a/web/public/js/components/server/http-host-redirect-box.js b/web/public/js/components/server/http-host-redirect-box.js index cea2f7aa..fa87b195 100644 --- a/web/public/js/components/server/http-host-redirect-box.js +++ b/web/public/js/components/server/http-host-redirect-box.js @@ -50,7 +50,10 @@ Vue.component("http-host-redirect-box", {
- [{{redirect.status}}][prefix] {{redirect.beforeURL}} -> {{redirect.afterURL}}   + [{{redirect.status}}] + [匹配前缀] + [正则匹配] + {{redirect.beforeURL}} -> {{redirect.afterURL}}  
diff --git a/web/views/@default/servers/server/settings/redirects/createPopup.html b/web/views/@default/servers/server/settings/redirects/createPopup.html index ccfddc06..ca1c3572 100644 --- a/web/views/@default/servers/server/settings/redirects/createPopup.html +++ b/web/views/@default/servers/server/settings/redirects/createPopup.html @@ -5,6 +5,8 @@
+ + @@ -17,15 +19,17 @@ - +
匹配模式 - + + + -

精准匹配跳转前的URL。

-

只要URL头部部分包含跳转前URL,即可跳转。

+

精准匹配跳转前的URL,即只有访问完全一样的URL才会跳转。

+

只要访问的URL头部部分包含跳转前URL,即可跳转。

+

可以在跳转前URL中使用正则表达式,然后可以在跳转后URL中使用正则表达式中括号的变量,比如${1}${2}等。

是否保留URL路径参数 diff --git a/web/views/@default/servers/server/settings/redirects/createPopup.js b/web/views/@default/servers/server/settings/redirects/createPopup.js index 87455673..87e78e2e 100644 --- a/web/views/@default/servers/server/settings/redirects/createPopup.js +++ b/web/views/@default/servers/server/settings/redirects/createPopup.js @@ -1,17 +1,41 @@ Tea.context(function () { - this.isCreating = true - if (window.parent.UPDATING_REDIRECT != null) { - this.isCreating = false - this.redirect = window.parent.UPDATING_REDIRECT - } else { - this.redirect = { - status: 0, - beforeURL: "", - afterURL: "", - matchPrefix: false, - keepRequestURI: false - } - } + this.isCreating = true + if (window.parent.UPDATING_REDIRECT != null) { + this.isCreating = false + this.redirect = window.parent.UPDATING_REDIRECT + } else { + this.redirect = { + status: 0, + beforeURL: "", + afterURL: "", + matchPrefix: false, + matchRegexp: false, + keepRequestURI: false + } + } - this.matchPrefix = (this.redirect.matchPrefix ? 1 : 0) + this.mode = "" + if (this.redirect.matchPrefix) { + this.mode = "matchPrefix" + } else if (this.redirect.matchRegexp) { + this.mode = "matchRegexp" + } else { + this.mode = "equal" + } + + this.$delay(function () { + let that = this + this.$watch("mode", function (v) { + if (v == "matchPrefix") { + that.redirect.matchPrefix = true + that.redirect.matchRegexp = false + } else if (v == "matchRegexp") { + that.redirect.matchPrefix = false + that.redirect.matchRegexp = true + } else { + that.redirect.matchPrefix = false + that.redirect.matchRegexp = false + } + }) + }) }) \ No newline at end of file