---
title: "ایجاد کلید کش لبه دینامیک برای سازگاری سئو چندزبانه"
---

# ایجاد کلید کش لبه دینامیک برای سازگاری سئو چندزبانه

هنگامی که یک وب‌سایت محتوا را به چندین زبان ارائه می‌دهد، لایهٔ لبه تبدیل به نقطهٔ حیاتی کنترل می‌شود. یک استراتژی کلید‑کش خوب می‌تواند نسخهٔ صحیح زبان را به‌صورت لحظه‌ای **در حالی که** اعتبار سایت در موتورهای جستجو را حفظ می‌کند، تحویل دهد. در این مقاله دلیل ناکافی بودن کلیدهای ایستاتیک سنتی، نحوهٔ کار ترکیب کلید دینامیک در لبه و الگوهایی که سیگنال‌های [سئو](https://moz.com/learn/seo/what-is-seo) را در مرزهای مختلف حفظ می‌کند، بررسی می‌شود.

## مشکل کلیدهای یک‌پارچه برای همه

اکثر ارائه‌دهندگان CDN به‌صورت پیش‌فرض از هش سادهٔ URL درخواست استفاده می‌کنند. این روش برای سایت‌های تک‌زبانه کار می‌کند، اما وقتی کاربری `/en/about` و کاربر دیگری `/fr/about` را درخواست می‌کند، هش تنها به‌دلیل بخش زبان متفاوت است. CDN دو شیء جداگانه را ذخیره می‌کند که این خود مشکلی نیست، اما کلید‑کش هنوز جزییات لازم برای منطق **hreflang** و **canonical** را در بر نمی‌گیرد. موتورهای جستجو این اشیاء را به‌عنوان منابع جداگانه می‌پذیرند؛ اگر همان صفحه تحت کلیدهای مختلف بدون سیگنال‌های مناسب کش شود، ممکن است جریمهٔ محتوای تکراری اعمال شود و بودجهٔ خزیدن برای دریافت مکرّر دارایی‌های یکسان هدر رود.

## اجزای اصلی یک کلید کش چندزبانه

یک کلید کش چندزبانهٔ قدرتمند معمولاً ترکیبی از ابعاد زیر است:

* **کد زبان** – استخراج‌شده از مسیر URL، زیر دامنه یا هدر `Accept-Language`.
* **راهنمای منطقه** – اختیاری، استخراج‌شده از دادهٔ GeoIP برای هدایت تغییرات منطقه‌ای مانند ارز یا واحدهای اندازه‌گیری.
* **دستگاه** – موبایل یا دسکتاپ، که برای طراحی واکنش‌گرا مهم است.
* **هدرهای درخواست متغیر** – برای مثال `Accept-Encoding` برای gzip در مقابل brotli، یا `User‑Agent` برای تست A/B.

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

## خط لولهٔ نرمال‌سازی در لبه

قبل از ترکیب کلید، تابع لبه باید درخواست را نرمال‌سازی کند:

1. **حذف پارامترهای ردیابی** – حذف رشته‌های query `utm_*` تا برچسب‌های تجزیه‌وتحلیل، کش را تقسیم نکنند.
2. **استانداردسازی مسیر** – رفع اسلش‌های تکراری، بخش‌های نسبی (`../`) و اسلش‌های انتهایی بر اساس سیاست URL سایت.
3. **نقشه‌برداری از نام‌های مستعار زبان** – در نظر گرفتن `/en-us` و `/en` به‌عنوان معادل اگر سایت فقط یک نسخهٔ انگلیسی داشته باشد.
4. **اعمال حروف کوچک** – URL‌ها برای اکثر سرورها حساس به حروف بزرگ/کوچک نیستند؛ اعمال حروف کوچک، تغییرات بی‌مورد را از بین می‌برد.

در ادامه یک مثال سادهٔ شبه‌کد آمده است که می‌تواند بر روی Cloudflare Workers، AWS Lambda@Edge یا هر زمان‌اجرای لبهٔ مبتنی بر V8 اجرا شود.

```javascript
// edge-key-generator.js
export async function handle(event) {
  const { request } = event;
  const url = new URL(request.url);

  // 1️⃣ Remove analytics parameters
  for (const param of url.searchParams.keys()) {
    if (param.startsWith('utm_')) url.searchParams.delete(param);
  }

  // 2️⃣ Normalize pathname
  url.pathname = decodeURI(url.pathname)
                    .replace(/\/{2,}/g, '/')
                    .replace(/\/$/, '');

  // 3️⃣ Detect language from path or header
  const langMatch = url.pathname.match(/^\/([a-z]{2})(?:-[A-Z]{2})?(?=\/|$)/);
  const language = langMatch ? langMatch[1] : request.headers.get('Accept-Language')?.split(',')[0]?.slice(0,2) || 'en';

  // 4️⃣ Build key components
  const region = request.headers.get('CF-IPCountry') || 'XX';
  const device = request.headers.get('User-Agent')?.includes('Mobile') ? 'mobile' : 'desktop';

  // 5️⃣ Assemble deterministic key
  const rawKey = `${language}|${region}|${device}|${url.pathname}`;
  const cacheKey = crypto.subtle.digest('SHA-256', new TextEncoder().encode(rawKey))