diff --git a/class/core/site_api.py b/class/core/site_api.py index 2b9c10278..4f059dbb3 100755 --- a/class/core/site_api.py +++ b/class/core/site_api.py @@ -3,6 +3,9 @@ import time import os import sys +from unicodedata import name + +from sqlalchemy import false import mw import re import json @@ -1174,13 +1177,14 @@ class site_api: ## get_redirect_status - def getRedirectStatusApi(self): + def getRedirectApi(self): _siteName = request.form.get("siteName",'') # read data base data_path = self.getRedirectDataPath(_siteName) data_content = mw.readFile(data_path) if data_content == False: + mw.execShell("mkdir {}/{}".format(self.redirectPath, _siteName)) return mw.returnJson(True, "", {"result": [], "count": 0}) # get # conf_path = "{}/{}/*.conf".format(self.redirectPath, siteName) @@ -1197,34 +1201,136 @@ class site_api: return mw.returnJson(True, "ok", {"result": data, "count": len(data)}) + def getRedirectConfApi(self): + _siteName = request.form.get("siteName",'') + _id = request.form.get("id",'') + if _id == '' or _siteName == '': + return mw.returnJson(False, "必填项不能为空!") + + data = mw.readFile("{}/{}/{}.conf".format(self.redirectPath, _siteName, _id)) + if data == False: + return mw.returnJson(False, "获取失败!") + return mw.returnJson(True, "ok", {"result": data}) + + + def saveRedirectConfApi(self): + _siteName = request.form.get("siteName",'') + _id = request.form.get("id",'') + _config = request.form.get("config", "") + if _id == '' or _siteName == '': + return mw.returnJson(False, "必填项不能为空!") + + _old_config = mw.readFile("{}/{}/{}.conf".format(self.redirectPath, _siteName, _id)) + if _old_config == False: + return mw.returnJson(False, "非法操作") + + mw.writeFile("{}/{}/{}.conf".format(self.redirectPath, _siteName, _id), _config) + rule_test = mw.checkWebConfig() + if rule_test != True: + mw.writeFile("{}/{}/{}.conf".format(self.redirectPath, _siteName, _id), _old_config) + return mw.returnJson(False, "Nginx 配置测试不通过, 请重试: {}".format(rule_test)) + + mw.restartWeb() + return mw.returnJson(True, "ok") + + # get redirect status - def setRedirectStatusApi(self): + def setRedirectApi(self): _siteName = request.form.get("siteName",'') _from = request.form.get("from",'') # from (example.com / /test/) _to = request.form.get("to",'') # redirect to _type = request.form.get("type",'') # path / domain _rType = request.form.get("r_type",'') # redirect type + _keepPath = request.form.get("keep_path",'') # keep path if _siteName == '' or _from == '' or _to == '' or _type == '' or _rType == '': return mw.returnJson(False, "必填项不能为空!") data_path = self.getRedirectDataPath(_siteName) data_content = mw.readFile(data_path) if os.path.exists(data_path) else "" - data = json.loads(data_content) if data_content != "" else {} + data = json.loads(data_content) if data_content != "" else [] - if _rType == "301": - _rType = 0 + _rTypeCode = 0 if _rType == "301" else 1 + _typeCode = 0 if _type == "path" else 1 + _keepPath = 1 if _keepPath == "1" else 0 + + # check if domain exists in site + if _typeCode == 1: + pid = mw.M('domain').where("name=?", (_siteName,)).field( + 'id,pid,name,port,addtime').select() + site_domain_lists = mw.M('domain').where("pid=?", (pid[0]['pid'],)).field( + 'name').select() + found = False + for item in site_domain_lists: + if item['name'] == _from: + found = True + break + if found == False: + return mw.returnJson(False, "域名不存在!") + + + file_content = "" + # path + if _typeCode == 0: + redirect_type = "permanent" if _rTypeCode == 0 else "redirect" + if not _from.startswith("/"): + _from = "/{}".format(_from) + if _keepPath == 1: + _to = "{}$1".format(_to) + _from = "{}(.*)".format(_from) + file_content = "rewrite ^{} {} {};".format(_from, _to, redirect_type) + # domain else: - _rType = 1 + if _keepPath == 1: + _to = "{}$request_uri".format(_to) + + redirect_type = "301" if _rTypeCode == 0 else "302" + _if = "if ($host ~ '^{}')".format(_from) + _return = "return {} {}; ".format(redirect_type, _to) + file_content = _if + "{\r\n " + _return + "\r\n}" - if _type == "path": - _type = 0 - else: - _type = 1 - data.append({"from": _from, "type": _type, "r_type": _rType, "r_to": _to}) + _id = mw.md5("{}+{}".format(file_content, _siteName)) + + # 防止规则重复 + for item in data: + if item["r_from"] == _from: + return mw.returnJson(False, "重复的规则!") + + rep = "http(s)?\:\/\/([a-zA-Z0-9][-a-zA-Z0-9]{0,62}\.)+([a-zA-Z0-9][a-zA-Z0-9]{0,62})+.?" + if not re.match(rep, _to): + return mw.returnJson(False, "错误的目标地址") + + # write data json file + data.append({"r_from": _from, "type": _typeCode, "r_type": _rTypeCode, "r_to": _to, 'keep_path': _keepPath, 'id': _id}) mw.writeFile(data_path, json.dumps(data)) + mw.writeFile("{}/{}.conf".format(self.getRedirectPath(_siteName), _id), file_content) + mw.restartWeb() return mw.returnJson(True, "ok") + + + # 删除指定重定向 + def delRedirectApi(self): + _siteName = request.form.get("siteName",'') + _id = request.form.get("id",'') + if _id == '' or _siteName == '': + return mw.returnJson(False, "必填项不能为空!") + + try: + data_path = self.getRedirectDataPath(_siteName) + data_content = mw.readFile(data_path) if os.path.exists(data_path) else "" + data = json.loads(data_content) if data_content != "" else [] + for item in data: + if item["id"] == _id: + data.remove(item) + break + # write database + mw.writeFile(data_path, json.dumps(data)) + # remove conf file + mw.execShell("rm -rf {}/{}.conf".format(self.getRedirectPath(_siteName), _id)) + except: + return mw.returnJson(False, "删除失败!") + return mw.returnJson(True, "删除成功!") def getProxyListApi(self): @@ -1397,6 +1503,9 @@ class site_api: def getRedirectDataPath(self, siteName): return "{}/{}/data.json".format(self.redirectPath, siteName) + def getRedirectPath(self, siteName): + return "{}/{}/".format(self.redirectPath, siteName) + def getDirBindRewrite(self, siteName, dirname): return self.rewritePath + '/' + siteName + '_' + dirname + '.conf' @@ -1692,21 +1801,14 @@ include enable-php-''' % (fix.strip().replace(',', '|'), domains.strip().replace content = content.replace('{$PHP_DIR}', self.setupPath + '/php') content = content.replace('{$PHPVER}', self.phpVersion) content = content.replace('{$OR_REWRITE}', self.rewritePath) + content = content.replace('{$OR_REDIRECT}', self.redirectPath) logsPath = mw.getLogsDir() content = content.replace('{$LOGPATH}', logsPath) mw.writeFile(vhost_file, content) - - rewrite_content = ''' -location /{ - if (!-e $request_filename) { - rewrite ^(.*)$ /index.php/$1 last; - break; - } -} - ''' + rewrite_file = self.rewritePath + '/' + self.siteName + '.conf' - mw.writeFile(rewrite_file, rewrite_content) + mw.writeFile(rewrite_file, "") def add(self, webname, port, ps, path, version): siteMenu = json.loads(webname) diff --git a/data/tpl/nginx.conf b/data/tpl/nginx.conf index d37f5662d..504cc6e8b 100755 --- a/data/tpl/nginx.conf +++ b/data/tpl/nginx.conf @@ -23,7 +23,7 @@ server #REWRITE-END #301-START - include /redirect/{$SERVER_NAME}/*.conf; + include {$OR_REDIRECT}/{$SERVER_NAME}/*.conf; ##301-END #禁止访问的文件或目录 diff --git a/route/static/app/site.js b/route/static/app/site.js index c8f62d7b5..6694c71cc 100755 --- a/route/static/app/site.js +++ b/route/static/app/site.js @@ -1424,19 +1424,16 @@ function openCache(siteName){ function to301(siteName, type, obj){ // 设置 页面展示 - // 设置 更新展示 - if(type == 1 || type == 3){ + if(type == 1) { obj = { - redirectname: (new Date()).valueOf(), - tourl: 'http://', - redirectdomain: [], - redirectpath: '', - redirecttype: '', + to: 'http://', + from: '', + r_type: '', type: 1, - domainorpath: 'domain', - holdpath: 1 + type: 'path', + keep_path: 1 } - layer.open({ + var redirect_form = layer.open({ type: 1, skin: 'demo-class', area: '650px', @@ -1448,26 +1445,22 @@ function to301(siteName, type, obj){ "
" + - "" + "