簡體   English   中英

我可以在 SvelteKit 項目中獲取用戶的 IP 地址嗎?

[英]Can I get the IP address of my users in a SvelteKit project?

我有興趣在用戶首次提交到我的網站時捕獲他們的 Inte.net 協議 (IP) 地址。 我的印象是 SvelteKit 提交與其他 node.js 服務器解決方案類似。

我一直在這篇文章中,我只是沒有看到像req.headers['x-forwarded-for']req.socket.remoteAddress類的遠程請求提交到 SvelteKit 中的 API 服務器。

這是我在請求中看到的內容(通過 API 提交中的控制台日志):

arg1:
    body: (... data ... )
    Headers:
        accept:'*/*'
        accept-encoding:'gzip, deflate'
        accept-language:'en-US,en;q=0.9'
        connection:'keep-alive'
        content-length:'141'
        content-type:'text/plain;charset=UTF-8'
        cookie:'userid=c03efd10-3085-46cb-bacd-9eaeb605426e'
        host:'192.168.1.22:3000'
        origin:'http://192.168.1.22:3000'
        referer:'http://192.168.1.22:3000/learn'
        user-agent:'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
    locals:
        userid: '....'
    method: 'POST'
    params: {}
    path: '/api/user_form'
    query: ...
    rawBody: ... 

絕對沒有socket['x-forwarded-for']沒有 header

請注意,我正在 local.network 上工作。 主機在一台機器上,客戶端在同一個網絡中的另一台機器上。 其實host=192.168.1.22:3000,client=192.168.1.4

注 2,我正在通過svelte-kit dev --host 0.0.0.0運行程序

我沒看到什么? 有沒有辦法使用 Sveltekit 從 websubmit 獲取客戶端用戶的 IP 地址?

只是讓人們知道......現在可以使用event.clientAddress

Sveltekit 中有一張票可能會解決此功能,希望很快https://github.com/sveltejs/kit/pull/3993

以下所有內容均用於生產/構建代碼。

> npm run build
> node build

由於 VITE,在開發模式下運行您的應用程序是不同的。


Svelte 適配器收到一個節點請求,其中還包括遠程 IP。 IP 可以用這里提到的方法提取。

然而,適配器僅將 Svelte IncomingRequest接口所需的值轉發給 Svelte Render。 然后 Svelte 將該接口進一步擴展為Request接口,並包含以下值:

export interface Request<Locals = Record<string, any>, Body = unknown> {
    url: URL;
    method: string;
    headers: RequestHeaders;
    rawBody: RawBody;
    params: Record<string, string>;
    body: ParameterizedBody<Body>;
    locals: Locals;
}

因此,我看到了四種可能的方法來解決這個問題:

  1. 創建一個問題以更新 Svelte IncomingRequest接口以包含遠程 IP。 (這也需要更新所有適配器)
  2. 創建您自己的中間件作為應用程序的入口點。 缺點是,您仍然無法在 Svelte handleroutes的任何地方獲得遠程 IP。 但是,您可以記錄 IP 或阻止某些路徑。
  3. 在代理后面運行您的應用程序,代理將在請求 header 中填充['x-forwarded-for'] ,如上面的界面所示,header 在您的 Svelte 請求中可用 ZA8CFDE6331BD59EB2AC96F8661
  4. 自行修改 Svelte IncomingRequest接口和 Adapter Middleware。 (這很臟,維護起來很亂)

由於 2. 是最適用的方式,這里有一個關於如何使用polka進行設置的示例 - 您當然也可以使用express或任何其他 HTTP 服務器。

/src/server.js文件,在這種情況下是我們的中間件:

import polka from 'polka'
import { assetsMiddleware, prerenderedMiddleware, kitMiddleware } from '../build/middlewares.js'

const { PORT, DOMAIN } = process.env

polka()
  .use((req, res, next) => {
      console.log(req.socket.remoteAddress);
    next()
  })

  // Load the SvelteKit build
  .use(assetsMiddleware, prerenderedMiddleware, kitMiddleware)

  .listen(PORT)

/svelte.config.js將我們的中間件配置為entryPoint - 使用默認adapter-node的最小示例:

import preprocess from 'svelte-preprocess';
import adapter from '@sveltejs/adapter-node';

/** @type {import('@sveltejs/kit').Config} */
const config = {
    preprocess: preprocess(),

    kit: {
        adapter: adapter({ entryPoint: './src/server.js' }),
        target: '#svelte'
    }
};

export default config;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM