feat: 支持反向代理HTTPS协议配置,生成正确的对外链接 (#416)

- 新增环境变量 `DANMU_API_PUBLIC_PROTO` 用于指定对外协议
- 请求处理时优先读取 `X-Forwarded-Proto` 头,无则回退至配置变量
- 修复反向代理环境下弹幕链接协议错误的问题
This commit is contained in:
huangxd- authored and GitHub committed 2026-08-02 08:54:55 +08:00
1 parent dcb4913ab7
commit d0ce3b92d5
3 files changed
+23 -2

No files matched your search

+1
View File
@@ -128,6 +128,7 @@ LogVar 弹幕 API 服务器
```
服务器将在 `http://{ip}:9321` 运行,默认token是`87654321`。
如需修改端口,可设置环境变量 `DANMU_API_PORT`(例如 `DANMU_API_PORT=8080 npm start`)。
HTTPS 反向代理应传递 `X-Forwarded-Proto`;无法传递时可设置 `DANMU_API_PUBLIC_PROTO=https`,用于生成正确的对外弹幕链接。
**热更新支持**:修改 `config/.env`,应用会自动检测并重新加载配置(无需重启应用)。
+4
View File
@@ -22,6 +22,10 @@ TOKEN=87654321
# 说明:本地 Node 服务会优先读取 DANMU_API_PORT;未设置时回退到 9321
# DANMU_API_PORT=9321
# API 对外访问协议(反向代理未传递 X-Forwarded-Proto 时使用)
# 可选值:http、https;默认值:http
# DANMU_API_PUBLIC_PROTO=https
# 系统管理访问令牌(用于系统管理功能)
# 如果未配置此值,则无法访问系统管理功能,需要先配置后在URL中填入此token才能打开系统管理
# 默认值:空(不启用系统管理访问控制)
+18 -2
View File
@@ -49,6 +49,21 @@ function detectNodeDeployPlatform() {
return "node";
}
function resolvePublicRequestProtocol(req) {
const forwardedProto = String(req.headers['x-forwarded-proto'] || '')
.split(',')[0]
.trim()
.toLowerCase();
if (forwardedProto === 'http' || forwardedProto === 'https') {
return forwardedProto;
}
const configuredProto = String(process.env.DANMU_API_PUBLIC_PROTO || 'http')
.trim()
.toLowerCase();
return configuredProto === 'https' ? 'https' : 'http';
}
/**
* 检查并自动复制配置文件
* 在Node环境下,如果config目录下没有.env,则自动从.env.example拷贝一份生成.env
@@ -270,8 +285,9 @@ process.on('SIGINT', cleanupWatcher);
function createServer() {
return http.createServer(async (req, res) => {
try {
// 构造完整的请求 URL
const fullUrl = `http://${req.headers.host}${req.url}`;
// 构造完整的请求 URL,反向代理场景优先使用客户端原始协议
const scheme = resolvePublicRequestProtocol(req);
const fullUrl = `${scheme}://${req.headers.host}${req.url}`;
// 获取请求客户端的ip,兼容反向代理场景
let clientIp = 'unknown';