بازگشت به بلاگ
۱۱ مهر ۱۴۰۴Sergei Solod4 دقیقه مطالعه

Yandex وبلاگم را بدون /en خزید؛ ریدایرکت‌های 308 جلوی 404 را گرفتند

بعد از اضافه‌کردن حدود ۳۰۰۰ صفحه با ساختار /en/blog/... به sitemap دیدم Yandex مسیرهای متناظر /blog/... را امتحان می‌کند. ریدایرکت‌های 308 که از قبل داشتم نگذاشتند این درخواست‌ها به 404 ختم شوند. نکته اصلی این نبود که Yandex «sitemap را خراب کرده»، بلکه ارزش یک لایه ریدایرکت دقیق برای مقاوم‌تر کردن معماری URL بود.

SEOYandexSitemapریدایرکت 308سئوی فنیCrawling

یک به‌روزرسانی sitemap با حدود ۳۰۰۰ صفحه جدید زیر /en/blog/... منتشر کردم. کمی بعد در Yandex Webmaster الگوی عجیبی دیدم: Yandex تلاش می‌کرد مسیرهای متناظر را زیر /blog/... و بدون پیشوند /en crawl کند.

اگر این URLها مستقیماً 404 می‌دادند، ممکن بود هزاران درخواست crawl بی‌فایده به مسیرهای ناموجود داشته باشم. خوشبختانه از قبل ریدایرکت‌های دائمی 308 را از مسیرهای بدون پیشوند زبان به URLهای واقعی انگلیسی تنظیم کرده بودم.

همین لایه کوچک routing دفاعی بسیار مفیدتر از چیزی شد که انتظار داشتم.

دقیقاً چه چیزی را مشاهده کردم؟

  1. sitemap را با حدود ۳۰۰۰ صفحه جدید در ساختار /en/blog/... منتشر کردم.
  2. بعد از آن Yandex Webmaster نشان داد Yandex در حال امتحان URLهای متناظر /blog/... است.
  3. برای این مسیرهای جایگزین از قبل 308 داشتم.
  4. در نتیجه درخواست‌ها به‌جای 404 به URLهای موردنظر /en/blog/... فرستاده شدند.

یک نکته مهم را باید نسبت به نسخه اولیه اصلاح کنم: نمی‌توانم ثابت کنم Yandex «sitemap را اشتباه parse کرده است». من مسیرهای غیرمنتظره را بعد از به‌روزرسانی sitemap دیدم، اما همین ترتیب زمانی علت داخلی را اثبات نمی‌کند. موتورهای جست‌وجو می‌توانند URLها را از سیگنال‌ها و منابع تاریخی مختلف پیدا کنند. بدون شواهد قوی‌تر، بیان دقیق فقط این است که Yandex مسیرهایی را crawl کرد که من انتظارشان را نداشتم.

این تفاوت مهم است. درخواست یک URL عجیب توسط crawler یک مشاهده است؛ توضیح اینکه چرا دقیقاً آن URL انتخاب شده، ادعای دیگری است.

چرا ریدایرکت‌های 308 مفید بودند؟

منطق من مسیر کوتاه‌تر را عملاً alias دائمی URL محلی‌سازی‌شده در نظر می‌گرفت:

/blog/example-post  -> 308 ->  /en/blog/example-post

پس حتی اگر crawler از URL غیرمنتظره وارد می‌شد، باز هم به صفحه‌ای می‌رسید که واقعاً قصد ارائه‌اش را داشتم.

308 Permanent Redirect یک ریدایرکت دائمی HTTP است که method و body درخواست را حفظ می‌کند. برای GETهای معمول crawlerها، حفظ method معمولاً نکته اصلی نیست؛ در این مورد مهم‌تر این بود که ریدایرکت به‌صراحت دائمی است. مستندات فعلی Yandex Webmaster هم 301 و هم 308 را ریدایرکت دائمی طبقه‌بندی می‌کند.

مستندات رسمی Yandex Webmaster درباره ریدایرکت‌ها.

این به این معنی نیست که 308 از نظر SEO همیشه بهتر از 301 است. من از قبل 308 داشتم و همان کاری را انجام داد که لازم بود: URL غیرمنتظره به بن‌بست تبدیل نشد.

ریدایرکت شبکه ایمنی است، نه اصلاح sitemap

ریدایرکت‌ها اثر مشکل را محدود کردند، اما crawl اضافی را مطلوب نمی‌کنند. هر ریدایرکت غیرضروری یک درخواست و hop اضافه دارد. همچنین یک قانون خیلی گسترده می‌تواند خطای تولید URL را پنهان کند اگر دیگر دنبال منبع URLهای اشتباه نروید.

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

در مورد من sitemap از ابتدا /en/blog/... داشت. 308ها فقط سایت را در برابر ورود crawler از /blog/... مقاوم‌تر کردند.

امروز چه چیزهایی را بررسی می‌کنم؟

  1. sitemap واقعی deploy شده را باز می‌کنم. فقط به generator اعتماد نمی‌کنم و چند URL از فایل نهایی را بررسی می‌کنم.
  2. response نهایی را چک می‌کنم. URLهایی که قرار است index شوند بهتر است بدون زنجیره‌های غیرضروری مستقیم به صفحه مقصد برسند.
  3. مسیرهای جایگزین قابل‌پیش‌بینی را تست می‌کنم. اگر URL قدیمی یا بدون prefix مقصد دائمی دارد، mapping باید واضح و یک‌به‌یک باشد.
  4. از redirect chain دوری می‌کنم. A -> B -> C از A -> C سخت‌تر قابل‌کنترل است.
  5. در صورت امکان گزارش crawler را با داده سمت سرور مقایسه می‌کنم. Webmaster ابزار خوبی است، اما همیشه منبع اولیه کشف URL را نشان نمی‌دهد.
  6. از crawling به‌تنهایی نتیجه ranking نمی‌گیرم. crawling، indexing، ranking و traffic مراحل جدا هستند.
curl -I https://example.com/blog/example-post

HTTP/2 308
location: https://example.com/en/blog/example-post

این نمونه صرفاً توضیحی است. هدف این است که status و مقصد دقیق را بررسی کنیم، نه اینکه فرض کنیم rule درست کار می‌کند.

چه چیزی را می‌توانم نتیجه بگیرم و چه چیزی را نه؟

می‌توانم تأیید کنم که 308های از قبل موجود مانع شدند درخواست‌های غیرمنتظره /blog/... به 404 برسند و آن‌ها را به URLهای هدف فرستادند.

نمی‌توانم تأیید کنم parser مربوط به sitemap در Yandex علت بوده است. همچنین افزایش ranking، بهبود indexing یا مقدار مشخصی از traffic «نجات‌یافته» را اندازه‌گیری نکردم. چنین ادعایی فراتر از شواهد من است.

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

وقتی هر دو وجود دارند، احتمال اینکه یک مسیر غیرمنتظره crawler به هزاران URL مرده تبدیل شود بسیار کمتر است.