یکی از چالش‌های زیرساختی اخیر، ایجاد اختلال در دسترسی خزنده‌های (Crawlers) موتورهای جست‌وجو و هوش مصنوعی (مانند Googlebot ،Bingbot و OpenAI) به وب‌سایت‌هاست.

باید به این نکته توجه داشت که این اختلال به دلیل محدودیت‌های اعمال‌شده بر ترافیک بین‌الملل در سطح شبکه کشور رخ داده است. آروان‌کلاد به‌عنوان ارایه‌دهنده خدمات ابری، نقشی در این محدودیت‌ها ندارد اما برای استمرار دسترسی بات‌ها به محتوای شما، راهکارهای فنی زیر را پیشنهاد می‌دهد.

اگر سرور اصلی (Origin) شما در خارج از ایران میزبانی می‌شود، این اختلال شامل سرویس شما نمی‌شود؛ زیرا ارتباط پاپ‌سایت‌های خارج از کشور آروان با سرورهای خارجی بدون محدودیت برقرار است.

اگر سرور اصلی وب‌سایت‌تان در ایران قرار دارد، می‌توانید یکی از شیوه‌های زیر را برای برقرار ارتباط دوباره با Crawlerها انتخاب کنید.

راهکار اول: تامین اینترنت برای سرور اصلی

این روش نیازمند این است که سرور داخلی شما دارای دسترسی مستقیم به اینترنت بین‌الملل باشد. برقراری این دسترسی نیازمند اخذ مجوزهای قانونی و پیگیری مستقیم کاربر از مراجع ذی‌صلاح (مانند سازمان نظام صنفی رایانه‌ای و…) است.

آروان‌کلاد به‌عنوان ارایه‌دهنده زیرساخت ابری، نقشی در اعمال یا مدیریت محدودیت‌ها ندارد و هیچ‌گونه خدماتی در زمینه‌ی اخذ این مجوزها ارایه نمی‌دهد.

با برقراری این ارتباط، پاپ‌سایت‌های آروان‌کلاد می‌توانند درخواست خزنده‌ها را به سرور شما ارسال کرده و پاسخ را دریافت کنند.

راهکار دوم: مسیریابی هوشمند با پردازش لبه (Edge Computing)

این راهکار برای سرویس‌هایی که فقط به دنبال ایندکس شدن صفحات به‌وسیله‌ی موتورهای جست‌وجو هستند و ترافیک خارج از کشور ندارند، بهترین گزینه است.

در این روش، با استفاده از Edge Compute آروان‌، ترافیک ورودی در لحظه تحلیل می‌شود. اگر درخواست‌کننده یک خزنده معتبر باشد، درخواست او به یک سرور کمکی در خارج از ایران (که محتوای شما را Mirror کرده یا به Origin متصل است) هدایت می‌شود.

منطق کد:

کد زیر ابتدا User-Agent را بررسی کرده و برای جلوگیری از حملات Spoofing، آدرس IP را با لیست بات‌های شناخته‌شده تطبیق می‌دهد. پس از تایید، درخواست به سمت ORIGIN_IP (سرور خارج از کشور) پروکسی می‌شود.

راهنمای ساخت پردازش لبه به شما در این مسیر کمک می‌کند.

// --- Origin server settings ---
const ORIGIN_IP = "1.2.3.4"; // IP سرور کمکی خارج از ایران


// --- Bot User Agents ---
const USER_AGENTS = [
    "bingbot", "googlebot",
];


// --- Bot IPs ---
// You can add IPs from https://docs.arvancloud.ir/fa/cdn/security/known-bots
const RAW_IPV4 = [
    // لیست آی‌پی‌های نسخه ۴ خزنده‌ها را اینجا قرار دهید
];


const RAW_IPV6 = [
    // لیست آی‌پی‌های نسخه ۶ خزنده‌ها را اینجا قرار دهید
];


const PARSED_V4 = RAW_IPV4.map((cidr) => parseCIDR(cidr, false));
const PARSED_V6 = RAW_IPV6.map((cidr) => parseCIDR(cidr, true));


function parseCIDR(cidr, isV6) {
  const [address, prefix] = cidr.split("/");
  const bitCount = isV6 ? 128n : 32n;
  const mask = ((1n << bitCount) - 1n) << (bitCount - BigInt(prefix)); return { network: ipToBigInt(address, isV6) & mask, mask, }; } addEventListener("fetch", (event) => {
  event.respondWith(handleRequest(event.request));
});


async function handleRequest(request) {
  const userAgent = request.headers.get("User-Agent")?.toLowerCase() || "";


  // Check Google user agents first to avoid unnecessary IP checks for non-Google traffic
  if (!USER_AGENTS.some((ua) => userAgent.includes(ua))) {
    return fetch(request); // Proxying عادی برای کاربران معمولی
  }


  const clientIp = request.headers.get("x-real-ip") || "";
  const isV6 = clientIp.includes(":");
  const clientBig = ipToBigInt(clientIp, isV6);
  const ranges = isV6 ? PARSED_V6 : PARSED_V4;


  const isVerified = ranges.some((r) => (clientBig & r.mask) === r.network);


  if (isVerified) {
    return proxyToUpstream(request); // هدایت مستقیم خزنده‌های تایید شده به سرور کمکی
  }


  return fetch(request);
}


function ipToBigInt(ip, isV6) {
  if (isV6) {
    const parts = ip.split("::");
    let full = parts[0].split(":").filter((x) => x !== "");
    if (parts.length > 1) {
      const right = parts[1].split(":").filter((x) => x !== "");
      full = [
        ...full,
        ...new Array(8 - full.length - right.length).fill("0"),
        ...right,
      ];
    }
    return full.reduce(
      (acc, hex) => (acc << 16n) + BigInt(Number.parseInt(hex, 16) || 0), 0n, ); } return ip.split(".").reduce((acc, octet) => (acc << 8n) + BigInt(octet), 0n);
}


async function proxyToUpstream(request) {
  try {
    const url = new URL(request.url);
    // ساخت URL جدید با IP سرور کمکی و حفظ مسیر اصلی درخواست
    const upstreamUrl = `https://${ORIGIN_IP}${url.pathname}${url.search}`;


    const newRequest = new Request(upstreamUrl, {
      method: request.method,
      headers: request.headers,
      body: request.body,
      redirect: "follow",
    });


    return await fetch(newRequest);
  } catch (e) {
    return new Response("Upstream Error", { status: 503 });
  }
}

راهکار سوم: استفاده از توزیع‌بار جغرافیایی (Geo Load Balancing)

اگر وب‌سایت شما علاوه بر کاربران داخلی، بازدیدکننده‌ از خارج از کشور نیز دارد، این روش پایدارترین راهکار است.

توجه داشته باشید که این قابلیت در بسته‌ی حرفه‌ای CDN آروان‌کلاد دردسترس قرار دارد.

شیوه پیاده‌سازی:

۱. در پنل کاربری CDN، به بخش ترافیک و سپس قوانین توزیع بار بروید.

۲. یک استخر (Pool) داخلی برای سرورهای ایران ایجاد کرده و آن را به پاپ‌سایت‌های داخل کشور متصل کنید.

۳. یک استخر خارجی برای سرورهای خارج از کشور ایجاد کرده و آن را به پاپ‌سایت‌های بین‌المللی متصل کنید.

با این معماری، ترافیک کاربران ایران به سرورهای داخلی و ترافیک تمامی بات‌ها و کاربران خارجی به سرور خارج هدایت شده و مشکل Crawl به‌طور کامل مرتفع می‌شود.

راهنمای توزیع بار به شما در این مسیر کمک می‌کند.

پس از پیاده‌سازی، برای اطمینان از دسترسی صحیح خزنده‌ها، از ابزار Rich Results Test گوگل استفاده کنید تا رفتار بات را مشاهده کنید.