From d999d739d532de30229a320d124f0ecad590fde5 Mon Sep 17 00:00:00 2001 From: Unchained Date: Fri, 3 Apr 2026 20:10:59 +0200 Subject: [PATCH] fix(analytics): connect directly to Rybbit to preserve real visitor IP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed Rybbit script loading from server-side rewrite to client-side direct connection. This prevents Next.js from proxying the request, which was causing all visitor IPs to show as the Hetzner server IP (138.201.11.251). Before: - Browser → Next.js → Rybbit (server-side proxy, loses client IP) After: - Browser → Rybbit (direct connection, real IP preserved) Changes: - layout.tsx: Use direct Rybbit URL for script src - next.config.ts: Remove /api/script.js rewrite --- next.config.ts | 6 ++---- src/app/[locale]/layout.tsx | 20 +++++++++++++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/next.config.ts b/next.config.ts index 241eff8..de2f1c0 100644 --- a/next.config.ts +++ b/next.config.ts @@ -34,10 +34,8 @@ const nextConfig: NextConfig = { async rewrites() { const rybbitHost = process.env.NEXT_PUBLIC_RYBBIT_HOST || "https://rybbit.nodecrew.me"; return [ - { - source: "/api/script.js", - destination: `${rybbitHost}/api/script.js`, - }, + // Note: /api/script.js now connects directly to Rybbit (client-side) + // to preserve real visitor IP instead of proxying through Next.js { source: "/api/track", destination: "/api/rybbit/track", diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx index aa345bd..6b4c1cc 100644 --- a/src/app/[locale]/layout.tsx +++ b/src/app/[locale]/layout.tsx @@ -3,9 +3,10 @@ import { NextIntlClientProvider } from "next-intl"; import { getMessages, setRequestLocale } from "next-intl/server"; import { SUPPORTED_LOCALES, DEFAULT_LOCALE, isValidLocale } from "@/lib/i18n/locales"; import Script from "next/script"; -import AnalyticsProvider from "@/components/providers/AnalyticsProvider"; +import ExitIntentDetector from "@/components/home/ExitIntentDetector"; const RYBBIT_SITE_ID = process.env.NEXT_PUBLIC_RYBBIT_SITE_ID || "1"; +const RYBBIT_HOST = process.env.NEXT_PUBLIC_RYBBIT_HOST || "https://rybbit.nodecrew.me"; const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://manoonoils.com"; @@ -49,14 +50,27 @@ export default async function LocaleLayout({ return ( <> -