diff --git a/backend/app/api/v1/website.go b/backend/app/api/v1/website.go index f21c717e3..508817d68 100644 --- a/backend/app/api/v1/website.go +++ b/backend/app/api/v1/website.go @@ -560,3 +560,47 @@ func (b *BaseApi) UpdatePHPFile(c *gin.Context) { } helper.SuccessWithData(c, nil) } + +// @Tags Website +// @Summary Get rewrite conf +// @Description 获取伪静态配置 +// @Accept json +// @Param request body request.NginxRewriteReq true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /websites/rewrite [post] +func (b *BaseApi) GetRewriteConfig(c *gin.Context) { + var req request.NginxRewriteReq + if err := c.ShouldBindJSON(&req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + res, err := websiteService.GetRewriteConfig(req) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, res) +} + +// @Tags Website +// @Summary Update rewrite conf +// @Description 更新伪静态配置 +// @Accept json +// @Param request body request.NginxRewriteUpdate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /websites/rewrite/update [post] +// @x-panel-log {"bodyKeys":["websiteID"],"paramKeys":[],"BeforeFuntions":[{"input_colume":"id","input_value":"websiteID","isList":false,"db":"websites","output_colume":"primary_domain","output_value":"domain"}],"formatZH":"伪静态配置修改 [domain]","formatEN":"Nginx conf rewrite update [domain]"} +func (b *BaseApi) UpdateRewriteConfig(c *gin.Context) { + var req request.NginxRewriteUpdate + if err := c.ShouldBindJSON(&req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + if err := websiteService.UpdateRewriteConfig(req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} diff --git a/backend/app/dto/request/nginx.go b/backend/app/dto/request/nginx.go index 7e2b0f18a..0fa085b0a 100644 --- a/backend/app/dto/request/nginx.go +++ b/backend/app/dto/request/nginx.go @@ -19,3 +19,14 @@ type NginxConfigUpdate struct { WebsiteID uint `json:"websiteId" validate:"required"` Params interface{} `json:"params"` } + +type NginxRewriteReq struct { + WebsiteID uint `json:"websiteId" validate:"required"` + Name string `json:"name" validate:"required"` +} + +type NginxRewriteUpdate struct { + WebsiteID uint `json:"websiteId" validate:"required"` + Name string `json:"name" validate:"required"` + Content string `json:"content" validate:"required"` +} diff --git a/backend/app/dto/response/website.go b/backend/app/dto/response/website.go index 4e842dad7..699a53de3 100644 --- a/backend/app/dto/response/website.go +++ b/backend/app/dto/response/website.go @@ -47,3 +47,7 @@ type WebsiteLog struct { type PHPConfig struct { Params map[string]string `json:"params"` } + +type NginxRewriteRes struct { + Content string `json:"content"` +} diff --git a/backend/app/model/website.go b/backend/app/model/website.go index 1eaaeaf54..bcb7ad14e 100644 --- a/backend/app/model/website.go +++ b/backend/app/model/website.go @@ -20,6 +20,7 @@ type Website struct { ErrorLog bool `json:"errorLog"` AccessLog bool `json:"accessLog"` DefaultServer bool `json:"defaultServer"` + Rewrite string `gorm:"type:varchar" json:"rewrite"` RuntimeID uint `gorm:"type:integer" json:"runtimeID"` Domains []WebsiteDomain `json:"domains" gorm:"-:migration"` WebsiteSSL WebsiteSSL `json:"webSiteSSL" gorm:"-:migration"` diff --git a/backend/app/service/website.go b/backend/app/service/website.go index f6404f0a5..60db8357d 100644 --- a/backend/app/service/website.go +++ b/backend/app/service/website.go @@ -2,12 +2,14 @@ package service import ( "bufio" + "bytes" "context" "crypto/x509" "encoding/pem" "errors" "fmt" "github.com/1Panel-dev/1Panel/backend/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/cmd/server/nginx_conf" "gorm.io/gorm" "os" "path" @@ -57,6 +59,8 @@ type IWebsiteService interface { GetPHPConfig(id uint) (*response.PHPConfig, error) UpdatePHPConfig(req request.WebsitePHPConfigUpdate) error UpdatePHPConfigFile(req request.WebsitePHPFileUpdate) error + GetRewriteConfig(req request.NginxRewriteReq) (*response.NginxRewriteRes, error) + UpdateRewriteConfig(req request.NginxRewriteUpdate) error } func NewIWebsiteService() IWebsiteService { @@ -981,3 +985,74 @@ func (w WebsiteService) UpdatePHPConfigFile(req request.WebsitePHPFileUpdate) er } return nil } + +func (w WebsiteService) UpdateRewriteConfig(req request.NginxRewriteUpdate) error { + website, err := websiteRepo.GetFirst(commonRepo.WithByID(req.WebsiteID)) + if err != nil { + return err + } + nginxFull, err := getNginxFull(&website) + if err != nil { + return err + } + includePath := fmt.Sprintf("/www/sites/%s/rewrite/%s.conf", website.PrimaryDomain, website.PrimaryDomain) + absolutePath := path.Join(nginxFull.Install.GetPath(), includePath) + fileOp := files.NewFileOp() + var oldRewriteContent []byte + if !fileOp.Stat(path.Dir(absolutePath)) { + if err := fileOp.CreateDir(path.Dir(absolutePath), 0755); err != nil { + return err + } + } + if !fileOp.Stat(absolutePath) { + if err := fileOp.CreateFile(absolutePath); err != nil { + return err + } + } else { + oldRewriteContent, err = fileOp.GetContent(absolutePath) + if err != nil { + return err + } + } + if err := fileOp.WriteFile(absolutePath, strings.NewReader(req.Content), 0755); err != nil { + return err + } + + if err := updateNginxConfig(constant.NginxScopeServer, []dto.NginxParam{{Name: "include", Params: []string{includePath}}}, &website); err != nil { + _ = fileOp.WriteFile(absolutePath, bytes.NewReader(oldRewriteContent), 0755) + return err + } + website.Rewrite = req.Name + return websiteRepo.Save(context.Background(), &website) +} + +func (w WebsiteService) GetRewriteConfig(req request.NginxRewriteReq) (*response.NginxRewriteRes, error) { + website, err := websiteRepo.GetFirst(commonRepo.WithByID(req.WebsiteID)) + if err != nil { + return nil, err + } + var contentByte []byte + if req.Name == "current" { + nginxInstall, err := getAppInstallByKey(constant.AppOpenresty) + if err != nil { + return nil, err + } + rewriteConfPath := path.Join(nginxInstall.GetPath(), "www", "sites", website.PrimaryDomain, "rewrite", fmt.Sprintf("%s.conf", website.PrimaryDomain)) + fileOp := files.NewFileOp() + if fileOp.Stat(rewriteConfPath) { + contentByte, err = fileOp.GetContent(rewriteConfPath) + if err != nil { + return nil, err + } + } + } else { + rewriteFile := fmt.Sprintf("rewrite/%s.conf", strings.ToLower(req.Name)) + contentByte, err = nginx_conf.Rewrites.ReadFile(rewriteFile) + if err != nil { + return nil, err + } + } + return &response.NginxRewriteRes{ + Content: string(contentByte), + }, err +} diff --git a/backend/init/migration/migrations/init.go b/backend/init/migration/migrations/init.go index 7c8c94239..4eeb664f2 100644 --- a/backend/init/migration/migrations/init.go +++ b/backend/init/migration/migrations/init.go @@ -276,7 +276,7 @@ var UpdateTableHost = &gormigrate.Migration{ } var UpdateTableWebsite = &gormigrate.Migration{ - ID: "20230406-update-table-website", + ID: "20230414-update-table-website", Migrate: func(tx *gorm.DB) error { return tx.AutoMigrate(&model.Website{}) }, diff --git a/backend/router/ro_website.go b/backend/router/ro_website.go index 3eca2bf83..96a6c609f 100644 --- a/backend/router/ro_website.go +++ b/backend/router/ro_website.go @@ -45,5 +45,8 @@ func (a *WebsiteRouter) InitWebsiteRouter(Router *gin.RouterGroup) { groupRouter.GET("/php/config/:id", baseApi.GetWebsitePHPConfig) groupRouter.POST("/php/config", baseApi.UpdateWebsitePHPConfig) groupRouter.POST("/php/update", baseApi.UpdatePHPFile) + + groupRouter.POST("/rewrite", baseApi.GetRewriteConfig) + groupRouter.POST("/rewrite/update", baseApi.UpdateRewriteConfig) } } diff --git a/backend/utils/nginx/components/config.go b/backend/utils/nginx/components/config.go index ec5107c08..5399fbb20 100644 --- a/backend/utils/nginx/components/config.go +++ b/backend/utils/nginx/components/config.go @@ -45,6 +45,7 @@ var repeatKeys = map[string]struct { "if": {}, "proxy_set_header": {}, "location": {}, + "include": {}, } func IsRepeatKey(key string) bool { diff --git a/cmd/server/docs/docs.go b/cmd/server/docs/docs.go index f8e27924d..7c13fc071 100644 --- a/cmd/server/docs/docs.go +++ b/cmd/server/docs/docs.go @@ -8715,6 +8715,90 @@ const docTemplate = `{ } } }, + "/websites/rewrite": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取伪静态配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get rewrite conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRewriteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/rewrite/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新伪静态配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update rewrite conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRewriteUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFuntions": [ + { + "db": "websites", + "input_colume": "id", + "input_value": "websiteID", + "isList": false, + "output_colume": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Nginx conf rewrite update [domain]", + "formatZH": "伪静态配置修改 [domain]", + "paramKeys": [] + } + } + }, "/websites/search": { "post": { "security": [ @@ -11830,9 +11914,15 @@ const docTemplate = `{ "proxy": { "type": "string" }, + "proxyType": { + "type": "string" + }, "remark": { "type": "string" }, + "rewrite": { + "type": "string" + }, "runtimeID": { "type": "integer" }, @@ -12404,6 +12494,40 @@ const docTemplate = `{ } } }, + "request.NginxRewriteReq": { + "type": "object", + "required": [ + "name", + "websiteId" + ], + "properties": { + "name": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NginxRewriteUpdate": { + "type": "object", + "required": [ + "content", + "name", + "websiteId" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, "request.NginxScopeReq": { "type": "object", "required": [ @@ -13402,9 +13526,15 @@ const docTemplate = `{ "proxy": { "type": "string" }, + "proxyType": { + "type": "string" + }, "remark": { "type": "string" }, + "rewrite": { + "type": "string" + }, "runtimeID": { "type": "integer" }, diff --git a/cmd/server/docs/swagger.json b/cmd/server/docs/swagger.json index c52a0c1b0..cf3223cc6 100644 --- a/cmd/server/docs/swagger.json +++ b/cmd/server/docs/swagger.json @@ -8708,6 +8708,90 @@ } } }, + "/websites/rewrite": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "获取伪静态配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Get rewrite conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRewriteReq" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/websites/rewrite/update": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "更新伪静态配置", + "consumes": [ + "application/json" + ], + "tags": [ + "Website" + ], + "summary": "Update rewrite conf", + "parameters": [ + { + "description": "request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request.NginxRewriteUpdate" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + }, + "x-panel-log": { + "BeforeFuntions": [ + { + "db": "websites", + "input_colume": "id", + "input_value": "websiteID", + "isList": false, + "output_colume": "primary_domain", + "output_value": "domain" + } + ], + "bodyKeys": [ + "websiteID" + ], + "formatEN": "Nginx conf rewrite update [domain]", + "formatZH": "伪静态配置修改 [domain]", + "paramKeys": [] + } + } + }, "/websites/search": { "post": { "security": [ @@ -11823,9 +11907,15 @@ "proxy": { "type": "string" }, + "proxyType": { + "type": "string" + }, "remark": { "type": "string" }, + "rewrite": { + "type": "string" + }, "runtimeID": { "type": "integer" }, @@ -12397,6 +12487,40 @@ } } }, + "request.NginxRewriteReq": { + "type": "object", + "required": [ + "name", + "websiteId" + ], + "properties": { + "name": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, + "request.NginxRewriteUpdate": { + "type": "object", + "required": [ + "content", + "name", + "websiteId" + ], + "properties": { + "content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "websiteId": { + "type": "integer" + } + } + }, "request.NginxScopeReq": { "type": "object", "required": [ @@ -13395,9 +13519,15 @@ "proxy": { "type": "string" }, + "proxyType": { + "type": "string" + }, "remark": { "type": "string" }, + "rewrite": { + "type": "string" + }, "runtimeID": { "type": "integer" }, diff --git a/cmd/server/docs/swagger.yaml b/cmd/server/docs/swagger.yaml index 59c22b6a1..1870f8838 100644 --- a/cmd/server/docs/swagger.yaml +++ b/cmd/server/docs/swagger.yaml @@ -1750,8 +1750,12 @@ definitions: type: string proxy: type: string + proxyType: + type: string remark: type: string + rewrite: + type: string runtimeID: type: integer status: @@ -2133,6 +2137,29 @@ definitions: required: - websiteId type: object + request.NginxRewriteReq: + properties: + name: + type: string + websiteId: + type: integer + required: + - name + - websiteId + type: object + request.NginxRewriteUpdate: + properties: + content: + type: string + name: + type: string + websiteId: + type: integer + required: + - content + - name + - websiteId + type: object request.NginxScopeReq: properties: scope: @@ -2799,8 +2826,12 @@ definitions: type: string proxy: type: string + proxyType: + type: string remark: type: string + rewrite: + type: string runtimeID: type: integer runtimeName: @@ -8398,6 +8429,59 @@ paths: formatEN: Nginx conf update [domain] formatZH: php 配置修改 [domain] paramKeys: [] + /websites/rewrite: + post: + consumes: + - application/json + description: 获取伪静态配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxRewriteReq' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Get rewrite conf + tags: + - Website + /websites/rewrite/update: + post: + consumes: + - application/json + description: 更新伪静态配置 + parameters: + - description: request + in: body + name: request + required: true + schema: + $ref: '#/definitions/request.NginxRewriteUpdate' + responses: + "200": + description: OK + security: + - ApiKeyAuth: [] + summary: Update rewrite conf + tags: + - Website + x-panel-log: + BeforeFuntions: + - db: websites + input_colume: id + input_value: websiteID + isList: false + output_colume: primary_domain + output_value: domain + bodyKeys: + - websiteID + formatEN: Nginx conf rewrite update [domain] + formatZH: 伪静态配置修改 [domain] + paramKeys: [] /websites/search: post: consumes: diff --git a/cmd/server/nginx_conf/nginx_conf.go b/cmd/server/nginx_conf/nginx_conf.go index 7a6b47ac1..24f80d4d6 100644 --- a/cmd/server/nginx_conf/nginx_conf.go +++ b/cmd/server/nginx_conf/nginx_conf.go @@ -1,6 +1,7 @@ package nginx_conf import ( + "embed" _ "embed" ) @@ -15,3 +16,6 @@ var Index []byte //go:embed index.php var IndexPHP []byte + +//go:embed rewrite/* +var Rewrites embed.FS diff --git a/cmd/server/nginx_conf/rewrite/crmeb.conf b/cmd/server/nginx_conf/rewrite/crmeb.conf new file mode 100644 index 000000000..4260774ee --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/crmeb.conf @@ -0,0 +1,6 @@ +location / { + if (!-e $request_filename) { + rewrite ^(.*)$ /index.php?s=/$1 last; + break; + } +} diff --git a/cmd/server/nginx_conf/rewrite/dabr.conf b/cmd/server/nginx_conf/rewrite/dabr.conf new file mode 100644 index 000000000..37c13132f --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/dabr.conf @@ -0,0 +1,5 @@ +location / { +if (!-e $request_filename) { +rewrite ^/(.*)$ /index.php?q=$1 last; +} +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/dbshop.conf b/cmd/server/nginx_conf/rewrite/dbshop.conf new file mode 100644 index 000000000..61d23f711 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/dbshop.conf @@ -0,0 +1,7 @@ +location /{ + try_files $uri $uri/ /index.php$is_args$args; +} + +location ~ \.htaccess{ + deny all; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/dedecms.conf b/cmd/server/nginx_conf/rewrite/dedecms.conf new file mode 100644 index 000000000..6e110cba5 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/dedecms.conf @@ -0,0 +1,10 @@ +rewrite "^/list-([0-9]+)\.html$" /plus/list.php?tid=$1 last; +rewrite "^/list-([0-9]+)-([0-9]+)-([0-9]+)\.html$" /plus/list.php?tid=$1&totalresult=$2&PageNo=$3 last; +rewrite "^/view-([0-9]+)-1\.html$" /plus/view.php?arcID=$1 last; +rewrite "^/view-([0-9]+)-([0-9]+)\.html$" /plus/view.php?aid=$1&pageno=$2 last; +rewrite "^/plus/list-([0-9]+)\.html$" /plus/list.php?tid=$1 last; +rewrite "^/plus/list-([0-9]+)-([0-9]+)-([0-9]+)\.html$" /plus/list.php?tid=$1&totalresult=$2&PageNo=$3 last; +rewrite "^/plus/view-([0-9]+)-1\.html$" /plus/view.php?arcID=$1 last; +rewrite "^/plus/view-([0-9]+)-([0-9]+)\.html$" /plus/view.php?aid=$1&pageno=$2 last; +rewrite "^/tags.html$" /tags.php last; +rewrite "^/tag-([0-9]+)-([0-9]+)\.html$" /tags.php?/$1/$2/ last; diff --git a/cmd/server/nginx_conf/rewrite/default.conf b/cmd/server/nginx_conf/rewrite/default.conf new file mode 100644 index 000000000..e69de29bb diff --git a/cmd/server/nginx_conf/rewrite/discuz.conf b/cmd/server/nginx_conf/rewrite/discuz.conf new file mode 100644 index 000000000..578da7653 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/discuz.conf @@ -0,0 +1,7 @@ +location / { + rewrite ^/archiver/((fid|tid)-[\w\-]+\.html)$ /archiver/index.php?$1 last; + rewrite ^/forum-([0-9]+)-([0-9]+)\.html$ /forumdisplay.php?fid=$1&page=$2 last; + rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&extra=page%3D$3&page=$2 last; + rewrite ^/space-(username|uid)-(.+)\.html$ /space.php?$1=$2 last; + rewrite ^/tag-(.+)\.html$ /tag.php?name=$1 last; + } \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/discuzx.conf b/cmd/server/nginx_conf/rewrite/discuzx.conf new file mode 100644 index 000000000..8058495a2 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/discuzx.conf @@ -0,0 +1,12 @@ +rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last; +rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last; +rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last; +rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last; +rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last; +rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last; +rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last; +rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last; +rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last; +if (!-e $request_filename) { + return 404; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/discuzx2.conf b/cmd/server/nginx_conf/rewrite/discuzx2.conf new file mode 100644 index 000000000..61059e21e --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/discuzx2.conf @@ -0,0 +1,14 @@ +location /bbs/ { + rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last; + rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last; + rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last; + rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last; + rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last; + rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last; + rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last; + rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last; + rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last; + if (!-e $request_filename) { + return 404; + } +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/discuzx3.conf b/cmd/server/nginx_conf/rewrite/discuzx3.conf new file mode 100644 index 000000000..661889734 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/discuzx3.conf @@ -0,0 +1,15 @@ +location / { + rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last; + rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last; + rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last; + rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last; + rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last; + rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last; + rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last; + rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last; + rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last; + if (!-e $request_filename) { + return 404; + } +} + diff --git a/cmd/server/nginx_conf/rewrite/drupal.conf b/cmd/server/nginx_conf/rewrite/drupal.conf new file mode 100644 index 000000000..460b7791d --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/drupal.conf @@ -0,0 +1,3 @@ +if (!-e $request_filename) { + rewrite ^/(.*)$ /index.php?q=$1 last; + } \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/ecshop.conf b/cmd/server/nginx_conf/rewrite/ecshop.conf new file mode 100644 index 000000000..3574daa73 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/ecshop.conf @@ -0,0 +1,32 @@ +if (!-e $request_filename) +{ +rewrite "^/index\.html" /index.php last; +rewrite "^/category$" /index.php last; +rewrite "^/feed-c([0-9]+)\.xml$" /feed.php?cat=$1 last; +rewrite "^/feed-b([0-9]+)\.xml$" /feed.php?brand=$1 last; +rewrite "^/feed\.xml$" /feed.php last; +rewrite "^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8 last; +rewrite "^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)(.*)\.html$" /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5 last; +rewrite "^/category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /category.php?id=$1&brand=$2&page=$3&sort=$4&order=$5 last; +rewrite "^/category-([0-9]+)-b([0-9]+)-([0-9]+)(.*)\.html$" /category.php?id=$1&brand=$2&page=$3 last; +rewrite "^/category-([0-9]+)-b([0-9]+)(.*)\.html$" /category.php?id=$1&brand=$2 last; +rewrite "^/category-([0-9]+)(.*)\.html$" /category.php?id=$1 last; +rewrite "^/goods-([0-9]+)(.*)\.html" /goods.php?id=$1 last; +rewrite "^/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /article_cat.php?id=$1&page=$2&sort=$3&order=$4 last; +rewrite "^/article_cat-([0-9]+)-([0-9]+)(.*)\.html$" /article_cat.php?id=$1&page=$2 last; +rewrite "^/article_cat-([0-9]+)(.*)\.html$" /article_cat.php?id=$1 last; +rewrite "^/article-([0-9]+)(.*)\.html$" /article.php?id=$1 last; +rewrite "^/brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)\.html" /brand.php?id=$1&cat=$2&page=$3&sort=$4&order=$5 last; +rewrite "^/brand-([0-9]+)-c([0-9]+)-([0-9]+)(.*)\.html" /brand.php?id=$1&cat=$2&page=$3 last; +rewrite "^/brand-([0-9]+)-c([0-9]+)(.*)\.html" /brand.php?id=$1&cat=$2 last; +rewrite "^/brand-([0-9]+)(.*)\.html" /brand.php?id=$1 last; +rewrite "^/tag-(.*)\.html" /search.php?keywords=$1 last; +rewrite "^/snatch-([0-9]+)\.html$" /snatch.php?id=$1 last; +rewrite "^/group_buy-([0-9]+)\.html$" /group_buy.php?act=view&id=$1 last; +rewrite "^/auction-([0-9]+)\.html$" /auction.php?act=view&id=$1 last; +rewrite "^/exchange-id([0-9]+)(.*)\.html$" /exchange.php?id=$1&act=view last; +rewrite "^/exchange-([0-9]+)-min([0-9]+)-max([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /exchange.php?cat_id=$1&integral_min=$2&integral_max=$3&page=$4&sort=$5&order=$6 last; +rewrite ^/exchange-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /exchange.php?cat_id=$1&page=$2&sort=$3&order=$4 last; +rewrite "^/exchange-([0-9]+)-([0-9]+)(.*)\.html$" /exchange.php?cat_id=$1&page=$2 last; +rewrite "^/exchange-([0-9]+)(.*)\.html$" /exchange.php?cat_id=$1 last; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/edusoho.conf b/cmd/server/nginx_conf/rewrite/edusoho.conf new file mode 100644 index 000000000..b0099dcff --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/edusoho.conf @@ -0,0 +1,8 @@ +location / { + index app.php; + try_files $uri @rewriteapp; +} + +location @rewriteapp { + rewrite ^(.*)$ /app.php/$1 last; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/emlog.conf b/cmd/server/nginx_conf/rewrite/emlog.conf new file mode 100644 index 000000000..e122a854d --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/emlog.conf @@ -0,0 +1,7 @@ +location / { +index index.php index.html; + if (!-e $request_filename) + { + rewrite ^/(.*)$ /index.php last; + } +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/empirecms.conf b/cmd/server/nginx_conf/rewrite/empirecms.conf new file mode 100644 index 000000000..c68b92d85 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/empirecms.conf @@ -0,0 +1,8 @@ +rewrite ^([^\.]*)/listinfo-(.+?)-(.+?)\.html$ $1/e/action/ListInfo/index.php?classid=$2&page=$3 last; +rewrite ^([^\.]*)/showinfo-(.+?)-(.+?)-(.+?)\.html$ $1/e/action/ShowInfo.php?classid=$2&id=$3&page=$4 last; +rewrite ^([^\.]*)/infotype-(.+?)-(.+?)\.html$ $1/e/action/InfoType/index.php?ttid=$2&page=$3 last; +rewrite ^([^\.]*)/tags-(.+?)-(.+?)\.html$ $1/e/tags/index.php?tagname=$2&page=$3 last; +rewrite ^([^\.]*)/comment-(.+?)-(.+?)-(.+?)-(.+?)-(.+?)-(.+?)\.html$ $1/e/pl/index\.php\?doaction=$2&classid=$3&id=$4&page=$5&myorder=$6&tempid=$7 last; +if (!-e $request_filename) { + return 404; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/laravel5.conf b/cmd/server/nginx_conf/rewrite/laravel5.conf new file mode 100644 index 000000000..da4c67474 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/laravel5.conf @@ -0,0 +1,3 @@ +location / { + try_files $uri $uri/ /index.php?$query_string; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/maccms.conf b/cmd/server/nginx_conf/rewrite/maccms.conf new file mode 100644 index 000000000..3470feeba --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/maccms.conf @@ -0,0 +1,5 @@ +rewrite ^/vod-(.*)$ /index.php?m=vod-$1 break; +rewrite ^/art-(.*)$ /index.php?m=art-$1 break; +rewrite ^/gbook-(.*)$ /index.php?m=gbook-$1 break; +rewrite ^/label-(.*)$ /index.php?m=label-$1 break; +rewrite ^/map-(.*)$ /index.php?m=map-$1 break; diff --git a/cmd/server/nginx_conf/rewrite/mvc.conf b/cmd/server/nginx_conf/rewrite/mvc.conf new file mode 100644 index 000000000..bf906257b --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/mvc.conf @@ -0,0 +1,6 @@ +location /{ + if (!-e $request_filename) { + rewrite ^(.*)$ /index.php/$1 last; + break; + } +} diff --git a/cmd/server/nginx_conf/rewrite/niushop.conf b/cmd/server/nginx_conf/rewrite/niushop.conf new file mode 100644 index 000000000..c32c40c71 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/niushop.conf @@ -0,0 +1,6 @@ +location / { + if (!-e $request_filename) { + rewrite ^(.*)$ /index.php?s=$1 last; + break; + } +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/phpcms.conf b/cmd/server/nginx_conf/rewrite/phpcms.conf new file mode 100644 index 000000000..a6e0df346 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/phpcms.conf @@ -0,0 +1,9 @@ +location / { + ###以下为PHPCMS 伪静态化rewrite法则 + rewrite ^(.*)show-([0-9]+)-([0-9]+)\.html$ $1/show.php?itemid=$2&page=$3; + rewrite ^(.*)list-([0-9]+)-([0-9]+)\.html$ $1/list.php?catid=$2&page=$3; + rewrite ^(.*)show-([0-9]+)\.html$ $1/show.php?specialid=$2; + ####以下为PHPWind 伪静态化rewrite法则 + rewrite ^(.*)-htm-(.*)$ $1.php?$2 last; + rewrite ^(.*)/simple/([a-z0-9\_]+\.html)$ $1/simple/index.php?$2 last; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/phpwind.conf b/cmd/server/nginx_conf/rewrite/phpwind.conf new file mode 100644 index 000000000..388af90d3 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/phpwind.conf @@ -0,0 +1,4 @@ +location / { + rewrite ^(.*)-htm-(.*)$ $1.php?$2 last; + rewrite ^(.*)/simple/([a-z0-9\_]+\.html)$ $1/simple/index.php?$2 last; + } \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/sablog.conf b/cmd/server/nginx_conf/rewrite/sablog.conf new file mode 100644 index 000000000..fa4f00c49 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/sablog.conf @@ -0,0 +1,16 @@ +location / { + rewrite "^/date/([0-9]{6})/?([0-9]+)?/?$" /index.php?action=article&setdate=$1&page=$2 last; + rewrite ^/page/([0-9]+)?/?$ /index.php?action=article&page=$1 last; + rewrite ^/category/([0-9]+)/?([0-9]+)?/?$ /index.php?action=article&cid=$1&page=$2 last; + rewrite ^/category/([^/]+)/?([0-9]+)?/?$ /index.php?action=article&curl=$1&page=$2 last; + rewrite ^/(archives|search|article|links)/?$ /index.php?action=$1 last; + rewrite ^/(comments|tagslist|trackbacks|article)/?([0-9]+)?/?$ /index.php?action=$1&page=$2 last; + rewrite ^/tag/([^/]+)/?([0-9]+)?/?$ /index.php?action=article&item=$1&page=$2 last; + rewrite ^/archives/([0-9]+)/?([0-9]+)?/?$ /index.php?action=show&id=$1&page=$2 last; + rewrite ^/rss/([0-9]+)?/?$ /rss.php?cid=$1 last; + rewrite ^/rss/([^/]+)/?$ /rss.php?url=$1 last; + rewrite ^/uid/([0-9]+)/?([0-9]+)?/?$ /index.php?action=article&uid=$1&page=$2 last; + rewrite ^/user/([^/]+)/?([0-9]+)?/?$ /index.php?action=article&user=$1&page=$2 last; + rewrite sitemap.xml sitemap.php last; + rewrite ^(.*)/([0-9a-zA-Z\-\_]+)/?([0-9]+)?/?$ $1/index.php?action=show&alias=$2&page=$3 last; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/seacms.conf b/cmd/server/nginx_conf/rewrite/seacms.conf new file mode 100644 index 000000000..0dc6f3612 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/seacms.conf @@ -0,0 +1,11 @@ +location / { + rewrite ^/frim/index(.+?)\.html$ /list/index.php?$1 last; + rewrite ^/movie/index(.+?)\.html$ /detail/index.php?$1 last; + rewrite ^/play/([0-9]+)-([0-9]+)-([0-9]+)\.html$ /video/index.php?$1-$2-$3 last; + rewrite ^/topic/index(.+?)\.html$ /topic/index.php?$1 last; + rewrite ^/topiclist/index(.+?).html$ /topiclist/index.php?$1 last; + rewrite ^/index\.html$ index.php permanent; + rewrite ^/news\.html$ news/ permanent; + rewrite ^/part/index(.+?)\.html$ /articlelist/index.php?$1 last; + rewrite ^/article/index(.+?)\.html$ /article/index.php?$1 last; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/shopex.conf b/cmd/server/nginx_conf/rewrite/shopex.conf new file mode 100644 index 000000000..f57463c1a --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/shopex.conf @@ -0,0 +1,5 @@ +location / { +if (!-e $request_filename) { +rewrite ^/(.+\.(html|xml|json|htm|php|jsp|asp|shtml))$ /index.php?$1 last; +} +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/shopwind.conf b/cmd/server/nginx_conf/rewrite/shopwind.conf new file mode 100644 index 000000000..0edf086c3 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/shopwind.conf @@ -0,0 +1,14 @@ +location / { + #Redirect everything that isn't a real file to index.php + try_files $uri $uri/ /index.php$is_args$args; +} +#If you want a single domain name at the front and back ends +location /admin { + try_files $uri $uri/ /admin/index.php$is_args$args; +} +location /mobile { + try_files $uri $uri/ /mobile/index.php$is_args$args; +} +location /api { + try_files $uri $uri/ /api/index.php$is_args$args; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/thinkphp.conf b/cmd/server/nginx_conf/rewrite/thinkphp.conf new file mode 100644 index 000000000..216b1dc23 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/thinkphp.conf @@ -0,0 +1,8 @@ +location ~* (runtime|application)/ { + return 403; +} +location / { + if (!-e $request_filename){ + rewrite ^(.*)$ /index.php?s=$1 last; break; + } +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/typecho.conf b/cmd/server/nginx_conf/rewrite/typecho.conf new file mode 100644 index 000000000..dae6ba9cc --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/typecho.conf @@ -0,0 +1,3 @@ + if (!-e $request_filename) { + rewrite ^(.*)$ /index.php$1 last; + } diff --git a/cmd/server/nginx_conf/rewrite/typecho2.conf b/cmd/server/nginx_conf/rewrite/typecho2.conf new file mode 100644 index 000000000..22397d847 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/typecho2.conf @@ -0,0 +1,5 @@ +location /typecho/ { + if (!-e $request_filename) { + rewrite ^(.*)$ /typecho/index.php$1 last; + } +} diff --git a/cmd/server/nginx_conf/rewrite/wordpress.conf b/cmd/server/nginx_conf/rewrite/wordpress.conf new file mode 100644 index 000000000..9fe73c1eb --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/wordpress.conf @@ -0,0 +1,6 @@ +location / +{ + try_files $uri $uri/ /index.php?$args; +} + +rewrite /wp-admin$ $scheme://$host$uri/ permanent; \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/wp2.conf b/cmd/server/nginx_conf/rewrite/wp2.conf new file mode 100644 index 000000000..0e5fbaede --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/wp2.conf @@ -0,0 +1,6 @@ +rewrite ^.*/files/(.*)$ /wp-includes/ms-files.php?file=$1 last; +if (!-e $request_filename){ + rewrite ^.+?(/wp-.*) $1 last; + rewrite ^.+?(/.*\.php)$ $1 last; + rewrite ^ /index.php last; +} \ No newline at end of file diff --git a/cmd/server/nginx_conf/rewrite/zblog.conf b/cmd/server/nginx_conf/rewrite/zblog.conf new file mode 100644 index 000000000..5d2de2b79 --- /dev/null +++ b/cmd/server/nginx_conf/rewrite/zblog.conf @@ -0,0 +1,9 @@ +if (-f $request_filename/index.html){ + rewrite (.*) $1/index.html break; +} +if (-f $request_filename/index.php){ + rewrite (.*) $1/index.php; +} +if (!-f $request_filename){ + rewrite (.*) /index.php; +} \ No newline at end of file diff --git a/frontend/src/api/interface/website.ts b/frontend/src/api/interface/website.ts index 31186c7ba..0aec32164 100644 --- a/frontend/src/api/interface/website.ts +++ b/frontend/src/api/interface/website.ts @@ -17,6 +17,7 @@ export namespace Website { appinstall?: NewAppInstall; webSiteSSL: SSL; runtimeID: number; + rewrite: string; } export interface WebsiteDTO extends Website { @@ -278,4 +279,19 @@ export namespace Website { content: string; type: string; } + + export interface RewriteReq { + websiteID: number; + name: string; + } + + export interface RewriteRes { + content: string; + } + + export interface RewriteUpdate { + websiteID: number; + name: string; + content: string; + } } diff --git a/frontend/src/api/modules/website.ts b/frontend/src/api/modules/website.ts index c9af4c914..e3c691a26 100644 --- a/frontend/src/api/modules/website.ts +++ b/frontend/src/api/modules/website.ts @@ -170,3 +170,11 @@ export const UpdatePHPConfig = (req: Website.PHPConfigUpdate) => { export const UpdatePHPFile = (req: Website.PHPUpdate) => { return http.post(`/websites/php/update`, req); }; + +export const GetRewriteConfig = (req: Website.RewriteReq) => { + return http.post(`/websites/rewrite`, req); +}; + +export const UpdateRewriteConfig = (req: Website.RewriteUpdate) => { + return http.post(`/websites/rewrite/update`, req); +}; diff --git a/frontend/src/global/mimetype.ts b/frontend/src/global/mimetype.ts index 0f62671fb..5ac8ad5f1 100644 --- a/frontend/src/global/mimetype.ts +++ b/frontend/src/global/mimetype.ts @@ -78,3 +78,35 @@ export const Languages = [ value: ['css'], }, ]; + +export const Rewrites = [ + 'default', + 'wordpress', + 'wp2', + 'typecho', + 'typecho2', + 'thinkphp', + 'laravel5', + 'discuz', + 'discuzx', + 'discuzx2', + 'discuzx3', + 'EduSoho', + 'EmpireCMS', + 'ShopWind', + 'crmeb', + 'dabr', + 'dbshop', + 'dedecms', + 'drupal', + 'ecshop', + 'emlog', + 'maccms', + 'mvc', + 'niushop', + 'phpcms', + 'sablog', + 'seacms', + 'shopex', + 'zblog', +]; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 08ec2d5c1..47d1646e9 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1166,6 +1166,11 @@ const message = { updateConfig: 'Update Config', isOn: 'On', isOff: 'Off', + rewrite: 'Pseudo Static', + rewriteMode: 'Scheme', + current: 'Current', + rewriteHelper: + 'If the website cannot be accessed normally after setting pseudo-static, please try to set it back to default', }, php: { short_open_tag: 'Short tag support', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 1bd7ebf0d..766f303cb 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1159,6 +1159,10 @@ const message = { updateConfig: '配置修改', isOn: '开启', isOff: '关闭', + rewrite: '伪静态', + rewriteMode: '方案', + current: '当前', + rewriteHelper: '若设置伪静态后,网站无法正常访问,请尝试设置回default', }, php: { short_open_tag: '短标签支持', diff --git a/frontend/src/views/website/runtime/create/index.vue b/frontend/src/views/website/runtime/create/index.vue index 6b76f0757..1ee59869d 100644 --- a/frontend/src/views/website/runtime/create/index.vue +++ b/frontend/src/views/website/runtime/create/index.vue @@ -191,6 +191,7 @@ const searchApp = (appId: number) => { const changeApp = (appId: number) => { for (const app of apps.value) { if (app.id === appId) { + initParam.value = false; getApp(app.key, mode.value); break; } diff --git a/frontend/src/views/website/website/config/basic/index.vue b/frontend/src/views/website/website/config/basic/index.vue index 72473ea54..7ccd43d97 100644 --- a/frontend/src/views/website/website/config/basic/index.vue +++ b/frontend/src/views/website/website/config/basic/index.vue @@ -15,14 +15,17 @@ + + + - + diff --git a/frontend/src/views/website/website/config/basic/rewrite/index.vue b/frontend/src/views/website/website/config/basic/rewrite/index.vue new file mode 100644 index 000000000..f0ca78114 --- /dev/null +++ b/frontend/src/views/website/website/config/basic/rewrite/index.vue @@ -0,0 +1,112 @@ + + +