Goal: ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ…ΠΎΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅ΠΊΠΊΠ΅Ρ€ Π°Ρ„Ρ„ΠΈΠ»ΠΊΠΈ Π² своСй инфраструктурС

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°: ΠΈΠ· Π·Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ Π² Π Π£ ΠΌΡ‹ частично ΠΏΠΎΠΊΠΈΠ΄Π°Π΅ΠΌ CloudFlare, ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для Ρ€Π°Π·Π΄Π°Ρ‡ΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π°Ρ„Ρ„ΠΈΠ»ΠΊΠ° ΠΏΡ€ΠΈΠ±ΠΈΡ‚Π° гвоздями ΠΊ CloudFlare

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ°Ρ‚ΡŒ запросы ΠΊ Π°Ρ„Ρ„ΠΈΠ»ΠΊΠ΅ Ρ‡Π΅Ρ€Π΅Π· свой ΠΌΠΈΠΊΡ€ΠΎ сСрвСр. Для этого Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ договорится, Π² ΠΊΠ°ΠΊΠΎΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ IP адрСс ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Если ΠΌΡ‹ просто Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запрос, Ρ‚ΠΎ Π² Π»ΠΎΠ³Π°Ρ… Π°Ρ„Ρ„ΠΈΠ»ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ°Ρ‚ΡŒ ΠΈΠΏ нашСго сСрвСра, вмСсто Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ip ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΠΎΠΌΠ°Π΅Ρ‚ ΠΎΡ‚Ρ‡Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ Π³Π΅ΠΎ ΠΈ Ρ‚.ΠΏ.

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π½Π° cloudflare workers:

export default async (  
  request: Request,  
  env: Env,  
  ctx: ExecutionContext,  
): Promise<Response> => {  
  const rURL = new URL(request.url);  
  try {  
    const paths = rURL.pathname.split("/").filter(Boolean);  
    const affId = paths.at(-1);  
  
    const affReq = await fetch(env.AFFILKA_DOMAIN + affId, {  
      headers: request.headers,  
      redirect: "manual",  
    });  
  
    const originalRedirectURL = affReq.headers.get("location");  
    
    const redirectURL = new URL(originalRedirectURL);  
  
    for (const [key, value] of rURL.searchParams.entries()) {  
      if (!redirectURL.searchParams.has(key)) {  
        redirectURL.searchParams.append(key, value);  
      }  
    }  
  
    const finalRedirectUrl = redirectURL.toString();  
  
    const headers = {  
      Location: finalRedirectUrl,  
    };  
  
    const response = new Response(null, {  
      status: 302,  
      headers,  
    });  
    return response;  
  } catch (err) {  
    console.log(err, err.message);  
    return Response.redirect(rURL.origin, 302);  
  }  
};

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ useragent, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² спСцифичСских сцСнариях (Π³Π΄Π΅ ΠΏΠΎ трСбованиям рСгулятора Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ внСсти Ρ‚Ρ€Π΅ΠΊΠΊΠΈΠ½Π³ Π΄ΠΎΠΌΠ΅Π½ прямо Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ: https://ganamax.mx/aff/s085cda74). Но Π½Π΅ ΠΏΡ€ΠΈ этом ΠΌΡ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ для CIS ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π»ΠΎΠΌΠ°Π΅Ρ‚ статистику Π²Π½ΡƒΡ‚Ρ€ΠΈ affilka.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ real user ip Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ: affilka-real-ip=8.8.8.8 Π’ΠΎΠ³Π΄Π° ΠΈ статистика Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΈ Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ согласно настроСк Π°Ρ„Ρ„ΠΈΠ»ΠΊΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΡ‹ смоТСм Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½Π΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° CF, Π½ΠΎ ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΠΌΡ€Π°Ρ… (ΠΊΠ°ΠΊ-Ρ‚ΠΎ Fastly ΠΈΠ»ΠΈ CCDN).