[功能] 添加 origin_host 字段以覆盖回源请求的 Host 头

This commit is contained in:
ryan
2026-03-16 12:19:39 +08:00
parent ce08099de1
commit 4daf681eff
14 changed files with 152 additions and 27 deletions
@@ -69,6 +69,24 @@ const proxyRouteSchema = z
return false;
}
}, '请输入合法的源站地址'),
origin_host: z
.string()
.trim()
.refine(
(value) =>
!value ||
(!/[\/\\\s]/.test(value) &&
!value.includes('://') &&
(() => {
try {
const parsed = new URL(`http://${value}`);
return parsed.host === value && Boolean(parsed.hostname);
} catch {
return false;
}
})()),
'请输入合法的回源主机名',
),
enabled: z.boolean(),
enable_https: z.boolean(),
cert_id: z.string(),
@@ -129,6 +147,7 @@ type FeedbackState = {
const defaultValues: ProxyRouteFormValues = {
domain: '',
origin_url: '',
origin_host: '',
enabled: true,
enable_https: false,
cert_id: '',
@@ -186,6 +205,7 @@ function toPayload(values: ProxyRouteFormValues): ProxyRouteMutationPayload {
return {
domain: values.domain.trim(),
origin_url: values.origin_url.trim(),
origin_host: values.origin_host.trim(),
enabled: values.enabled,
enable_https: values.enable_https,
cert_id:
@@ -204,6 +224,7 @@ function toFormValues(route: ProxyRouteItem): ProxyRouteFormValues {
return {
domain: route.domain,
origin_url: route.origin_url,
origin_host: route.origin_host || '',
enabled: route.enabled,
enable_https: route.enable_https,
cert_id: route.cert_id ? String(route.cert_id) : '',
@@ -510,7 +531,12 @@ export function ProxyRoutesPage() {
{route.domain}
</td>
<td className="px-3 py-4 text-[var(--foreground-secondary)]">
{route.origin_url}
<div className="space-y-1">
<p>{route.origin_url}</p>
<p className="text-xs text-[var(--foreground-muted)]">
回源主机名: {route.origin_host || '$host'}
</p>
</div>
</td>
<td className="px-3 py-4">
{route.enable_https ? (
@@ -633,6 +659,16 @@ export function ProxyRoutesPage() {
</ResourceField>
</div>
<ResourceField
label="回源主机名"
hint="可选。填写后将覆盖回源请求的 Host,留空则默认使用访问域名 $host"
error={form.formState.errors.origin_host?.message}
>
<ResourceInput
{...form.register('origin_host')}
/>
</ResourceField>
<div className="grid gap-4 lg:grid-cols-2">
<ToggleField
label="启用规则"
@@ -7,6 +7,7 @@ export interface ProxyRouteItem {
id: number;
domain: string;
origin_url: string;
origin_host: string;
enabled: boolean;
enable_https: boolean;
cert_id: number | null;
@@ -20,6 +21,7 @@ export interface ProxyRouteItem {
export interface ProxyRouteMutationPayload {
domain: string;
origin_url: string;
origin_host: string;
enabled: boolean;
enable_https: boolean;
cert_id: number | null;
@@ -397,7 +397,12 @@ export function WebsiteDetailPage({websiteId}: { websiteId: string }) {
</div>
</td>
<td className="px-3 py-4 text-[var(--foreground-secondary)]">
<p className="max-w-72 break-all">{route.origin_url}</p>
<div className="max-w-72 space-y-1 break-all">
<p>{route.origin_url}</p>
<p className="text-xs text-[var(--foreground-muted)]">
回源主机名: {route.origin_host || '$host'}
</p>
</div>
</td>
<td className="px-3 py-4">
<div className="flex flex-wrap gap-2">