Skip to content

[Bug] API: type="proxy" website creation returns 500 Internal Server Error #12598

@BruceSuen720

Description

@BruceSuen720

1Panel 版本

v2.1.10(最新稳定版,2026-04-23)

问题类型

Bug: type="proxy" 网站创建 API 返回 500 内部错误

问题描述

通过 REST API 创建 type="proxy" 类型的网站时,无论如何组合请求参数,都返回 500 Internal Server Error,响应体为空。

复现步骤

API 端点

POST http://10.0.0.6:18866/api/v2/websites

请求头

1Panel-Token: <md5("1panel" + API_KEY + timestamp)>
1Panel-Timestamp: <unix_timestamp>
Content-Type: application/json
Accept: application/json

请求体(尝试了多种组合)

尝试 1: type="proxy" + appType 空

{
  "primaryDomain": "test.com",
  "type": "proxy",
  "alias": "test",
  "remark": "",
  "appType": "",
  "appInstallId": 0,
  "webSiteGroupId": 5,
  "otherDomains": "",
  "proxy": "http://127.0.0.1:8080",
  "proxyType": "",
  "ftpUser": "",
  "ftpPassword": ""
}

结果: 400 - AppType validation failed ('oneof' tag 要求 non-empty)

尝试 2: type="proxy" + appType="new"
结果: 500 - 响应体为空

尝试 3: type="proxy" + appType="installed" + appInstallId=0
结果: 500 - 响应体为空

尝试 4: type 换为 "deployment" + appType="new" + appDetailId=4053
结果: 500 - 响应体为空

根因分析

通过阅读 1Panel 源码(dev 分支),发现 backend/app/service/website.go 第 274 行附近的 CreateWebsite 函数中:

switch create.Type {
case constant.Deployment:
    // 处理代码...
case constant.Runtime:
    // 处理代码...
case constant.Node:
    // 处理代码...
case constant.Java:
    // 处理代码...
case constant.App:
    // 处理代码...
case constant.Static:
    // 处理代码...
// ❌ constant.Proxy 没有 case!会落入 default
default:
    // ❌ 也没有处理 Proxy 类型
}

当 type="proxy" 时,代码落入 default 分支,调用 configDefaultNginx(create, &website, appInstall)。对于 Proxy 类型,website.Proxy 是空字符串(因为没有任何 case 设置它),导致 createProxyFile 生成的 nginx 配置中 proxy_pass 为空。nginx 配置检查失败后,1Panel 回滚整个事务,返回 500 错误。

前端代码证据

frontend/src/views/website/website/create/index.vue 中,对于 type="proxy" 类型,前端只设置了:

website.proxy = that.proxyAddress;

但后端的 CreateWebsite switch 语句中没有对应的 case,所以 create.Proxy 值无法被正确传递到处理逻辑中。

相关日志输出

无(500 错误响应体为空,无法获取更多调试信息)

期望的正常行为

能够通过 API 成功创建一个 type="proxy" 的网站,参数示例:

{
  "primaryDomain": "example.com",
  "type": "proxy",
  "alias": "example",
  "remark": "反向代理测试",
  "appType": "",
  "appInstallId": 0,
  "webSiteGroupId": 5,
  "otherDomains": "",
  "proxy": "http://127.0.0.1:8080",
  "proxyType": "",
  "ftpUser": "",
  "ftpPassword": ""
}

可能的修复方案

在 backend/app/service/website.go 的 CreateWebsite switch 中添加 constant.Proxy case:

case constant.Proxy:
    if create.proxy == "" {
        return nil, errors.New("proxy address is required")
    }
    website.Type = constant.Proxy
    website.Proxy = create.proxy
    if err := createWebsiteFolder(websitePath, website); err != nil {
        return nil, err
    }

环境信息

  • 1Panel 版本: v2.1.10
  • 操作系统: debian (容器环境)
  • OpenResty: 1.21.4.3
  • API Key: 已配置(可复现)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions