mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-11 09:46:37 +08:00
91 lines
2.6 KiB
TypeScript
91 lines
2.6 KiB
TypeScript
import type {ProxyRouteConfigSection, ProxyRouteItem} from '@/lib/services/openflare';
|
|
|
|
export const proxyRouteConfigSections = [
|
|
{
|
|
key: 'domains' as const,
|
|
label: '域名设置',
|
|
description: '维护站点标识、域名列表和证书绑定。',
|
|
},
|
|
{
|
|
key: 'limits' as const,
|
|
label: '流量限制',
|
|
description: '设置连接数和限速。',
|
|
},
|
|
{
|
|
key: 'proxy' as const,
|
|
label: '反向代理',
|
|
description: '配置主回源和上游地址。',
|
|
},
|
|
{
|
|
key: 'cache' as const,
|
|
label: '缓存',
|
|
description: '配置站点缓存策略。',
|
|
},
|
|
{
|
|
key: 'waf' as const,
|
|
label: 'WAF',
|
|
description: '绑定 WAF 规则组,并查看当前站点生效策略。',
|
|
},
|
|
{
|
|
key: 'auth' as const,
|
|
label: '认证配置',
|
|
description: '配置基础鉴权访问,需要输入账号密码才能访问网站。',
|
|
},
|
|
] satisfies ReadonlyArray<{
|
|
key: ProxyRouteConfigSection;
|
|
label: string;
|
|
description: string;
|
|
}>;
|
|
|
|
const domainPattern =
|
|
/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/i;
|
|
|
|
export function getProxyRouteConfigSection(
|
|
value: string | null | undefined,
|
|
): ProxyRouteConfigSection {
|
|
return proxyRouteConfigSections.some((section) => section.key === value)
|
|
? (value as ProxyRouteConfigSection)
|
|
: 'domains';
|
|
}
|
|
|
|
export function validateDomain(domain: string): string | null {
|
|
const normalized = domain.trim().toLowerCase();
|
|
if (!normalized) {
|
|
return '请输入域名';
|
|
}
|
|
if (!domainPattern.test(normalized)) {
|
|
return '域名格式不合法';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function parseOriginUrl(originUrl: string) {
|
|
const parsed = new URL(originUrl);
|
|
const port = parsed.port || (parsed.protocol === 'http:' ? '80' : '443');
|
|
const path = parsed.pathname === '/' ? '' : parsed.pathname;
|
|
|
|
return {
|
|
scheme: parsed.protocol.replace(':', '') as 'http' | 'https',
|
|
address: parsed.hostname,
|
|
port,
|
|
uri: parsed.search ? `${path}${parsed.search}` || parsed.search : path,
|
|
};
|
|
}
|
|
|
|
export function getUpstreamSummary(route: ProxyRouteItem): string {
|
|
if (route.upstream_type === 'pages') {
|
|
return route.pages_project_id
|
|
? `Pages 项目 #${route.pages_project_id}`
|
|
: 'Pages 项目未绑定';
|
|
}
|
|
if (route.upstream_type === 'tunnel') {
|
|
const protocol = route.tunnel_target_protocol || 'http';
|
|
const target = route.tunnel_target_addr || '未配置目标';
|
|
return `Tunnel → ${protocol}://${target}`;
|
|
}
|
|
if (route.upstream_list.length <= 1) {
|
|
return route.origin_url;
|
|
}
|
|
return `${route.upstream_list.length} 个上游,主上游 ${route.origin_url}`;
|
|
}
|