diff --git a/web/html/settings.html b/web/html/settings.html
index e664e6ec..20fa238e 100644
--- a/web/html/settings.html
+++ b/web/html/settings.html
@@ -120,6 +120,10 @@
oldAllSetting: new AllSetting(),
allSetting: new AllSetting(),
saveBtnDisable: true,
+ entryHost: null,
+ entryPort: null,
+ entryProtocol: null,
+ entryIsIP: false,
user: {},
lang: LanguageManager.getLanguage(),
inboundOptions: [],
@@ -233,6 +237,9 @@
loading(spinning = true) {
this.loadingStates.spinning = spinning;
},
+ _isIp(h) {
+ return /^[0-9.]+$/.test(h) || /^[0-9a-fA-F:]+$/.test(h);
+ },
async getAllSetting() {
const msg = await HttpUtil.post("/panel/setting/all");
@@ -307,16 +314,39 @@
this.loading(true);
const msg = await HttpUtil.post("/panel/setting/restartPanel");
this.loading(false);
- if (msg.success) {
- this.loading(true);
- await PromiseUtil.sleep(5000);
- var { webCertFile, webKeyFile, webDomain: host, webPort: port, webBasePath: base } = this.allSetting;
- if (host == this.oldAllSetting.webDomain) host = null;
- if (port == this.oldAllSetting.webPort) port = null;
- const isTLS = webCertFile !== "" || webKeyFile !== "";
- const url = URLBuilder.buildURL({ host, port, isTLS, base, path: "panel/settings" });
- window.location.replace(url);
+ if (!msg.success) return;
+
+ this.loading(true);
+ await PromiseUtil.sleep(5000);
+
+ const { webDomain, webPort, webBasePath, webCertFile, webKeyFile } = this.allSetting;
+ const newProtocol = (webCertFile || webKeyFile) ? "https:" : "http:";
+
+ const base = webBasePath ? webBasePath.replace(/^\//, "") : "";
+
+ if (!this.entryIsIP) {
+ const url = new URL(window.location.href);
+ url.pathname = `/${base}panel/settings`;
+ window.location.replace(url.toString());
+ return;
}
+
+ let finalHost = this.entryHost;
+ let finalPort = this.entryPort || "";
+
+ if (webDomain && this._isIp(webDomain)) {
+ finalHost = webDomain;
+ }
+
+ if (webPort && Number(webPort) !== Number(this.entryPort)) {
+ finalPort = String(webPort);
+ }
+
+ const url = new URL(`${newProtocol}//${finalHost}`);
+ if (finalPort) url.port = finalPort;
+ url.pathname = `/${base}panel/settings`;
+
+ window.location.replace(url.toString());
},
toggleTwoFactor(newValue) {
if (newValue) {
@@ -568,6 +598,10 @@
}
},
async mounted() {
+ this.entryHost = window.location.hostname;
+ this.entryPort = window.location.port;
+ this.entryProtocol = window.location.protocol;
+ this.entryIsIP = this._isIp(this.entryHost);
await this.getAllSetting();
await this.loadInboundTags();
while (true) {