You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SvelteKit+TypeScript中将用户公网IP加入X-Forwarded-For请求头?

解决SvelteKit中获取用户公网IP并添加到请求头的问题

核心原因:反向代理导致的本地IP问题

当你的应用部署在反向代理(如Nginx、Vercel、Cloudflare、Netlify等)之后,event.getClientAddress()默认只会返回代理服务器的本地IP,而非用户的公网IP。这时候需要让SvelteKit信任代理,从而从代理传递的X-Forwarded-For等头中提取真实IP。

步骤1:配置SvelteKit信任代理

在SvelteKit的配置文件(svelte.config.js或svelte.config.ts)中,添加trustProxy选项,告诉SvelteKit哪些代理是可信的,这样它会正确解析代理传递的IP头:

import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
import adapter from '@sveltejs/adapter-auto'; // 或你使用的特定适配器

/** @type {import('@sveltejs/kit').Config} */
const config = {
  preprocess: vitePreprocess(),
  kit: {
    adapter: adapter(),
    // 根据部署环境配置信任代理
    trustProxy: true, // Vercel/Netlify等平台可直接设为true
    // 更安全的方式:指定特定IP段(自托管场景推荐)
    // trustProxy: '10.0.0.0/8,172.16.0.0/12,192.168.0.0/16'
  }
};

export default config;

如果是自托管Nginx环境,还需要在Nginx配置中添加IP传递规则:

location / {
    proxy_pass http://your-sveltekit-app:3000;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
}

步骤2:获取公网IP并添加到请求头

配置完成后,event.getClientAddress()会自动返回用户的真实公网IP(从X-Forwarded-For头解析)。你可以在服务器端代码中(如hooks.server.ts或登录API路由)将IP添加到请求头:

示例1:全局hooks中处理(所有请求生效)

// src/hooks.server.ts
import type { Handle } from '@sveltejs/kit';

export const handle: Handle = async ({ event, resolve }) => {
  const clientIP = event.getClientAddress();
  // 将IP添加到当前请求头
  event.request.headers.set('X-Forwarded-For', clientIP);
  // 同时存入locals供页面组件使用
  event.locals.clientIP = clientIP;

  const response = await resolve(event);
  return response;
};

示例2:登录API路由中单独处理

// src/routes/api/login/+server.ts
import type { RequestHandler } from './$types';

export const POST: RequestHandler = async ({ event }) => {
  const clientIP = event.getClientAddress();
  
  // 调用后端服务时携带IP头
  const loginRequest = new Request('https://your-backend-api/login', {
    method: 'POST',
    headers: {
      ...event.request.headers,
      'X-Forwarded-For': clientIP
    },
    body: event.request.body
  });
  
  const backendResponse = await fetch(loginRequest);
  // 处理登录逻辑...
  
  return new Response(JSON.stringify({ success: true }), { status: 200 });
};

关键注意事项

  • 安全保障:只信任你可控的代理服务器,避免恶意伪造X-Forwarded-For头。自托管场景下优先指定具体IP段,而非直接设trustProxy: true。
  • 多层代理处理:如果存在多层代理,X-Forwarded-For会包含多个IP(格式为用户IP, 代理1IP, 代理2IP),SvelteKit的getClientAddress()会自动提取最左侧的用户真实IP,无需手动拆分。
  • 无外部API依赖:这种方法完全依赖代理传递的IP头,不需要调用外部IP查询服务,规避了安全风险和额外请求开销。

内容的提问来源于stack exchange,提问作者Jay0813

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:01:20