mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	如果管理系统同时设置了HTTP和HTTPS端口,那么访问HTTP登录页时自动跳转到HTTPS地址
This commit is contained in:
		@@ -9,12 +9,15 @@ import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/setup"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	adminserverutils "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/server/admin-server-utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/dao"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
	stringutil "github.com/iwind/TeaGo/utils/string"
 | 
			
		||||
	"net"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -32,6 +35,25 @@ func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
 | 
			
		||||
	Auth *helpers.UserShouldAuth
 | 
			
		||||
}) {
 | 
			
		||||
	// 是否自动从HTTP跳转到HTTPS
 | 
			
		||||
	if this.Request.TLS == nil {
 | 
			
		||||
		httpsPort, _ := adminserverutils.ReadServerHTTPS()
 | 
			
		||||
		if httpsPort > 0 {
 | 
			
		||||
			currentHost, _, err := net.SplitHostPort(this.Request.Host)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				currentHost = this.Request.Host
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var newHost = configutils.QuoteIP(currentHost)
 | 
			
		||||
			if httpsPort != 443 /** default https port **/ {
 | 
			
		||||
				newHost += ":" + types.String(httpsPort)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			this.RedirectURL("https://" + newHost + this.Request.RequestURI)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// DEMO模式
 | 
			
		||||
	this.Data["isDemo"] = teaconst.IsDemoMode
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,86 @@
 | 
			
		||||
package adminserverutils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
	"gopkg.in/yaml.v3"
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var ServerConfigIsChanged = false
 | 
			
		||||
 | 
			
		||||
const configFilename = "server.yaml"
 | 
			
		||||
 | 
			
		||||
// LoadServerConfig 读取当前服务配置
 | 
			
		||||
func LoadServerConfig() (*TeaGo.ServerConfig, error) {
 | 
			
		||||
	configFile := Tea.ConfigFile(configFilename)
 | 
			
		||||
	data, err := os.ReadFile(configFile)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	var serverConfig = &TeaGo.ServerConfig{}
 | 
			
		||||
	err = yaml.Unmarshal(data, serverConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return serverConfig, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WriteServerConfig 保存当前服务配置
 | 
			
		||||
func WriteServerConfig(serverConfig *TeaGo.ServerConfig) error {
 | 
			
		||||
	data, err := yaml.Marshal(serverConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	err = os.WriteFile(Tea.ConfigFile(configFilename), data, 0666)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ServerConfigIsChanged = true
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadServerHTTPS 检查HTTPS地址
 | 
			
		||||
func ReadServerHTTPS() (port int, err error) {
 | 
			
		||||
	config, err := LoadServerConfig()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	if config == nil {
 | 
			
		||||
		return 0, errors.New("could not load server config")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if config.Https.On && len(config.Https.Listen) > 0 {
 | 
			
		||||
		for _, listen := range config.Https.Listen {
 | 
			
		||||
			_, portString, splitErr := net.SplitHostPort(listen)
 | 
			
		||||
			if splitErr == nil {
 | 
			
		||||
				var portInt = types.Int(portString)
 | 
			
		||||
				if portInt > 0 {
 | 
			
		||||
					// 是否已经启动
 | 
			
		||||
					checkErr := func() error {
 | 
			
		||||
						conn, connErr := net.DialTimeout("tcp", ":"+portString, 1*time.Second)
 | 
			
		||||
						if connErr != nil {
 | 
			
		||||
							return connErr
 | 
			
		||||
						}
 | 
			
		||||
						_ = conn.Close()
 | 
			
		||||
						return nil
 | 
			
		||||
					}()
 | 
			
		||||
					if checkErr != nil {
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					port = portInt
 | 
			
		||||
					err = nil
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
@@ -2,6 +2,7 @@ package server
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	adminserverutils "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/server/admin-server-utils"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IndexAction struct {
 | 
			
		||||
@@ -13,9 +14,9 @@ func (this *IndexAction) Init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *IndexAction) RunGet(params struct{}) {
 | 
			
		||||
	this.Data["serverIsChanged"] = serverConfigIsChanged
 | 
			
		||||
	this.Data["serverIsChanged"] = adminserverutils.ServerConfigIsChanged
 | 
			
		||||
 | 
			
		||||
	serverConfig, err := loadServerConfig()
 | 
			
		||||
	serverConfig, err := adminserverutils.LoadServerConfig()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ package server
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	adminserverutils "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/server/admin-server-utils"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"net"
 | 
			
		||||
)
 | 
			
		||||
@@ -16,7 +17,7 @@ func (this *UpdateHTTPPopupAction) Init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdateHTTPPopupAction) RunGet(params struct{}) {
 | 
			
		||||
	serverConfig, err := loadServerConfig()
 | 
			
		||||
	serverConfig, err := adminserverutils.LoadServerConfig()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
@@ -38,7 +39,7 @@ func (this *UpdateHTTPPopupAction) RunPost(params struct {
 | 
			
		||||
		this.Fail("请输入绑定地址")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serverConfig, err := loadServerConfig()
 | 
			
		||||
	serverConfig, err := adminserverutils.LoadServerConfig()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.Fail("保存失败:" + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
@@ -58,7 +59,7 @@ func (this *UpdateHTTPPopupAction) RunPost(params struct {
 | 
			
		||||
	}
 | 
			
		||||
	serverConfig.Http.Listen = listen
 | 
			
		||||
 | 
			
		||||
	err = writeServerConfig(serverConfig)
 | 
			
		||||
	err = adminserverutils.WriteServerConfig(serverConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.Fail("保存失败:" + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	adminserverutils "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/server/admin-server-utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
@@ -21,7 +22,7 @@ func (this *UpdateHTTPSPopupAction) Init() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *UpdateHTTPSPopupAction) RunGet(params struct{}) {
 | 
			
		||||
	serverConfig, err := loadServerConfig()
 | 
			
		||||
	serverConfig, err := adminserverutils.LoadServerConfig()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
@@ -70,7 +71,7 @@ func (this *UpdateHTTPSPopupAction) RunPost(params struct {
 | 
			
		||||
		this.Fail("请输入绑定地址")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serverConfig, err := loadServerConfig()
 | 
			
		||||
	serverConfig, err := adminserverutils.LoadServerConfig()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.Fail("保存失败:" + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
@@ -133,7 +134,7 @@ func (this *UpdateHTTPSPopupAction) RunPost(params struct {
 | 
			
		||||
		serverConfig.Https.Cert = "configs/https.cert.pem"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = writeServerConfig(serverConfig)
 | 
			
		||||
	err = adminserverutils.WriteServerConfig(serverConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.Fail("保存配置失败:" + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
package server
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/iwind/TeaGo"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
	"gopkg.in/yaml.v3"
 | 
			
		||||
	"os"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var serverConfigIsChanged = false
 | 
			
		||||
 | 
			
		||||
// 读取当前服务配置
 | 
			
		||||
func loadServerConfig() (*TeaGo.ServerConfig, error) {
 | 
			
		||||
	configFile := Tea.ConfigFile("server.yaml")
 | 
			
		||||
	data, err := os.ReadFile(configFile)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	serverConfig := &TeaGo.ServerConfig{}
 | 
			
		||||
	err = yaml.Unmarshal(data, serverConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return serverConfig, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 保存当前服务配置
 | 
			
		||||
func writeServerConfig(serverConfig *TeaGo.ServerConfig) error {
 | 
			
		||||
	data, err := yaml.Marshal(serverConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	err = os.WriteFile(Tea.ConfigFile("server.yaml"), data, 0666)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serverConfigIsChanged = true
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -2,9 +2,6 @@
 | 
			
		||||
 | 
			
		||||
<warning-message v-if="serverIsChanged">服务配置已修改,请在命令行下重启后生效。</warning-message>
 | 
			
		||||
 | 
			
		||||
<div class="margin"></div>
 | 
			
		||||
<p class="comment">这里可以修改当前管理系统的HTTP和HTTPS访问服务。</p>
 | 
			
		||||
 | 
			
		||||
<h3>HTTP <a href="/settings/server/http" v-if="!teaDemoEnabled" @click.prevent="updateHTTP()">修改</a><a v-if="teaDemoEnabled">[演示版无法修改]</a></h3>
 | 
			
		||||
 | 
			
		||||
<table class="ui table definition selectable">
 | 
			
		||||
@@ -18,7 +15,7 @@
 | 
			
		||||
		<td class="title">绑定地址</td>
 | 
			
		||||
		<td>
 | 
			
		||||
			<span v-for="listen in serverConfig.http.listen" class="ui label tiny basic">{{listen}}</span>
 | 
			
		||||
			<p class="ui comment">如果地址中的IP是0.0.0.0,表示服务器的所有IP都可以用来使用访问当前管理系统。</p>
 | 
			
		||||
			<p class="ui comment">访问当前管理系统的HTTP地址;如果地址中的IP是0.0.0.0,表示服务器的所有IP都可以访问。</p>
 | 
			
		||||
		</td>
 | 
			
		||||
	</tr>
 | 
			
		||||
</table>
 | 
			
		||||
@@ -37,7 +34,7 @@
 | 
			
		||||
		<td class="title">绑定地址</td>
 | 
			
		||||
		<td>
 | 
			
		||||
			<span v-for="listen in serverConfig.https.listen" class="ui label tiny basic">{{listen}}</span>
 | 
			
		||||
			<p class="ui comment">如果地址中的IP是0.0.0.0,表示服务器的所有IP都可以用来使用访问当前管理系统。</p>
 | 
			
		||||
			<p class="ui comment">访问当前管理系统的HTTPS地址;如果地址中的IP是0.0.0.0,表示服务器的所有IP都可以访问。</p>
 | 
			
		||||
		</td>
 | 
			
		||||
	</tr>
 | 
			
		||||
	<tr>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user