Blog · 2026-08-30

sitemap-এর lastmod রোজ মিথ্যা বললে Google আর আপনার কথা শোনে না: কনটেন্ট হ্যাশ স্টেট মেশিনের পদ্ধতি

স্ট্যাটিক সাইট প্রতিবার রিবিল্ডে lastmod-কে বিল্ডের সময় দিয়ে চাপা দেয়, এটা আসলে রোজ Google-কে মিথ্যা বলা; সঠিক সমাধান হলো নয়েজ ছেঁটে ফেলে কনটেন্টের হ্যাশ করা আর তার সঙ্গে একটা স্টেট মেশিন জুড়ে দেওয়া, যাতে কনটেন্ট সত্যিই বদলালে তবেই তারিখ নড়ে।

নিজের sitemap.xml খুলুন, কয়েকশো URL-এর lastmod সবগুলোই আজ ভোরের একই মিনিটে, কারণ ডিপ্লয়ের শিডিউলটা সবে চলেছে। কনটেন্টে একটা অক্ষরও বদলায়নি, বদলেছে শুধু বিল্ডের সময়। এমন sitemap রোজ Google-কে চেঁচিয়ে বলে "গোটা সাইট আপডেট হয়েছে", আর অনেকদিন চেঁচালে আপনি যে পাতাটা সত্যিই আপডেট করেছেন সেটাও সে দেখতে আসার আগ্রহ হারায়। এটা বিরল দুর্ঘটনা নয়, বেশিরভাগ স্ট্যাটিক সাইট জেনারেটরের ডিফল্ট আচরণই এটা।

উপসর্গ: গোটা সাইটের lastmod একই টাইমস্ট্যাম্প

রোগ নির্ণয়ে এক নজরই যথেষ্ট: sitemap খুলুন, প্রতিটা <lastmod> যদি একই সময় হয় আর সেটা ঠিক গত ডিপ্লয়ের সময়ের সমান হয়, তাহলে আপনার জেনারেটর প্রায় নিশ্চিতভাবে "এখনকার সময়"-কেই মডিফিকেশন টাইম ধরে ব্যবহার করছে: date.today() ঢুকে গেছে dateModified-এ, নয়তো বিল্ড স্ক্রিপ্ট সরাসরি lastmod-কে বিল্ডের মুহূর্ত দিয়ে চাপা দিয়েছে। আরেকটা পরোক্ষ প্রমাণ আছে Google Search Console-এ: sitemap স্পষ্টই পড়া হয়েছে দেখাচ্ছে, অথচ যে পাতাগুলো সত্যিই বদলেছে সেগুলো আবার ক্রল হওয়ার অপেক্ষাতেই থেকে যাচ্ছে।

"শিডিউল ধরে স্বয়ংক্রিয় রিবিল্ড" হয় এমন সাইটে সমস্যাটা সবচেয়ে তীব্র। আমরা নিজেরাই একটা 402 পাতার খেলার কনটেন্ট সাইট চালাই যেটা দিনে 4 বার নিজে থেকে রিবিল্ড হয় (পয়েন্ট টেবিল আর সূচি রোজ বদলায়, তাই রিবিল্ড জরুরি); বিল্ডের সময়কে lastmod ধরলে প্রতিদিন প্রতিটা পাতার হয়ে ঘোষণা করা হবে "এটা 4 বার আপডেট হয়েছে", অথচ বেশিরভাগ পাতার মূল লেখায় একটা বাইটও নড়েনি। আরও খারাপ হলো একই মিথ্যা সাধারণত দুবার বলা হয়: একবার sitemap-এ, আরেকবার পাতার স্ট্রাকচার্ড ডেটার dateModified-এ।

Google-এর অবস্থান: অনির্ভরযোগ্য lastmod মানে সেটা নেই ধরা

Google-এর অফিশিয়াল sitemap ডকুমেন্টেশনে কথাটা খুব সরাসরি লেখা: lastmod তখনই গোনায় ধরা হয় যখন সেটা "ধারাবাহিকভাবে এবং যাচাইযোগ্যভাবে নির্ভুল" (consistently and verifiably accurate), আর যাচাইয়ের একটা উপায় হলো পাতার আসল পরিবর্তনের সঙ্গে মিলিয়ে দেখা। একই ডকুমেন্টেই সংজ্ঞা দেওয়া আছে কোন আপডেট চিহ্নিত করার যোগ্য: মূল কনটেন্ট, স্ট্রাকচার্ড ডেটা বা পাতার লিঙ্ক বদলালে তবেই গোনায় ধরা হয়; কপিরাইটের সাল বদলানো গোনায় ধরা হয় না।

lastmod-এর কাজ হলো ক্রলারকে অগ্রাধিকার সাজাতে সাহায্য করা, তাকে বলা "আগে এই কটা পাতা ক্রল করো, বাকিগুলো দরকার নেই"। গোটা সাইট রোজ আপডেটের হাঁক দিলে এই সংকেতের মান শূন্যে নেমে যায়: কোন পাতাটা সত্যিই বদলেছে Google আর আলাদা করতে পারে না, আর আপনি নিজের হাতেই সবচেয়ে দামি ক্রলিং ইঙ্গিতটা ছুড়ে ফেলে দেন। যে সাইট দিনে কয়েকবার রিবিল্ড হয় আর চায় আপডেট দ্রুত ইনডেক্স হোক, তার জন্য এটা নিজের পায়ে নিজে কুড়াল মারা।

সঠিক সমাধান: কনটেন্ট হ্যাশ স্টেট মেশিন, তারিখ চলবে কনটেন্টের সঙ্গে

নীতিটা এক বাক্যে: lastmod আসা উচিত নয় "কখন বিল্ড হলো" থেকে, আসা উচিত "কনটেন্ট কখন বদলাল" থেকে। পদ্ধতি হলো প্রতিটা পাতার জন্য এমন একটা স্টেট ফাইল রাখা যা বিল্ডের পরেও টিকে থাকে:

{ "/match/group-a/": {
    "hash": "3f2a…",
    "publishedAt": "2026-06-10",
    "updatedAt": "2026-08-12" } }

প্রতিবার বিল্ডে প্রতিটা পাতার জন্য একই প্রক্রিয়া চালান:

  1. HTML তৈরি হওয়ার পর মূল লেখা বের করুন, নরমালাইজ করুন, SHA256 হিসাব করুন।
  2. স্টেট ফাইলে এই পাতাটা নেই → নতুন পাতা, publishedAt আর updatedAt দুটোতেই আজকের তারিখ লিখুন।
  3. হ্যাশ গতবারের মতোই → কিছুই নাড়বেন না, পুরনো তারিখই থাকবে।
  4. হ্যাশ আলাদা → updatedAt-এ আজকের তারিখ বসান, স্টেট ফাইলে লিখে রাখুন।

sitemap-এর lastmod, স্ট্রাকচার্ড ডেটার dateModified আর পাতায় দেখানো "শেষ আপডেট", সবই স্টেট ফাইল থেকে পড়া হবে; তিন জায়গাই একই সত্যের উৎস ভাগ করে নেবে। স্টেট ফাইল ভার্শন রিপোজিটরি বা ডিপ্লয় আর্টিফ্যাক্টের সঙ্গে চলবে, যত বারই রিবিল্ড হোক স্মৃতি হারাবে না। কখন লিখে রাখা হবে সেটাও ভেবে ঠিক করতে হবে: ডিপ্লয় সফল হয়েছে নিশ্চিত হওয়ার পরেই ডিস্কে লিখুন, ব্যর্থ বিল্ড যেন স্টেট নষ্ট করতে না পারে, না হলে একবার ভেঙে পড়া বিল্ড গোটা সাইটের তারিখ নিজের সঙ্গে টেনে নামাবে।

হ্যাশ করার আগে পরিষ্কার করে ছাঁটুন: script আর ট্র্যাকিং কোড কনটেন্ট নয়

এই ব্যবস্থাটা সবচেয়ে বেশি মরে হ্যাশটা বড্ড মোটা দাগে হিসাব করার কারণে। গোটা HTML-এর ওপর সরাসরি হ্যাশ করলে দেখবেন প্রতিবার বিল্ডেই গোটা সাইট "বদলে গেছে": ট্র্যাকিং কোডের নতুন ভার্শন, অ্যাসেট ফাইলের নামে বসা ক্যাশ ফিঙ্গারপ্রিন্ট (app.a1b2c3.js), র‍্যান্ডম nonce, ফুটারে স্বয়ংক্রিয়ভাবে বসা সাল; এর যেকোনো একটা নড়লেই গোটা সাইটের হ্যাশ নতুন হয়ে যায় আর স্টেট মেশিনটা কাগুজে হয়ে দাঁড়ায়। একই কারণে "সম্পর্কিত লেখা"-র মতো যে ব্লক প্রতিবার বিল্ডে এলোমেলোভাবে বাছা হয়, সেটাকেও হ্যাশের পরিধির বাইরে রাখতে হবে।

তাই হ্যাশ করার আগে ছাঁটতে হবে। সত্যিকারের HTML parser দিয়ে (রেগুলার এক্সপ্রেশন দিয়ে নয়) <script>, <style> আর কমেন্ট গোটা গোটা সরিয়ে ফেলুন, ট্র্যাকিং প্যারামিটার আর ভার্শন ফিঙ্গারপ্রিন্ট মুছে দিন, শুধু মূল কনটেন্ট এলাকার লেখা আর কাঠামো রাখুন, হোয়াইটস্পেস নরমালাইজ করার পর হিসাব করুন। আপনি যা যা ছেঁটে ফেললেন, সেগুলোই ঠিক সেইসব জিনিস যেগুলোকে Google-এর সংজ্ঞায় "উল্লেখযোগ্য আপডেট নয়" বলা হয়েছে; হ্যাশের সীমারেখাটা অফিশিয়াল significant-এর সীমারেখা ধরেই কাটুন।

প্রকাশের তারিখ আর আপডেটের তারিখ দুটো আলাদা ফিল্ড, মিশিয়ে ফেলবেন না

আরেকটা প্রচলিত ভুল হলো গোটা সাইটে তারিখের একটাই ফিল্ড রাখা। প্রকাশের তারিখ (publishedAt) একবার লেখা হলে আর নড়া উচিত নয়; আপডেটের তারিখ (updatedAt) শুধু হ্যাশ বদলালে নড়বে। আউটপুটের নিয়মটা এক লাইনেই বলা যায়:

lastmod = updatedAt ?? publishedAt

যে পাতা বদলায়নি, তার lastmod সৎভাবে প্রকাশের তারিখেই দাঁড়িয়ে থাকবে, এতে লজ্জার কিছু নেই; আর যে পাতা সত্যিই বদলেছে, তার lastmod ঠিক সেই দিনটাকেই দেখাবে, আর সেটারই মূল্য আছে।

যাচাইয়ে নেগেটিভ টেস্ট করতে হবে, দুটো শর্তই পাস করা চাই: পরপর দুবার বিল্ড চালান, দ্বিতীয়বারে শূন্য পাতায় পরিবর্তন হতে হবে; তারপর কোনো একটা পাতার একটা অনুচ্ছেদ বদলান, শুধু সেই পাতারই lastmod নড়ার অনুমতি আছে। এর যেকোনো একটা শর্ত না মিললে বুঝতে হবে নয়েজ এখনও পরিষ্কার হয়নি, আর আপনার sitemap এখনও মিথ্যা বলছে।

শেষ কথা

lastmod হলো আপনার আর ক্রলারের মধ্যেকার ক্রেডিট লিমিট, আর ক্রেডিট জমে "অকারণে না নড়ার" ওপর। তারিখটাকে কনটেন্টের হ্যাশে বেঁধে দিলে মিথ্যা বলার ব্যাপারটা প্রক্রিয়া থেকেই উঠে যায়, আত্মনিয়ন্ত্রণের ভরসায় নয়, ব্যবস্থার ভরসায়। আপনার সাইটও যদি কয়েকশো পাতার হয়, শিডিউল ধরে রোজ রিবিল্ড হয়, অথচ sitemap-টা কখনও Google-কে দিয়ে মন দিয়ে দেখাতে পারেনি, তাহলে জেনে রাখুন এই স্টেট মেশিন আমাদের নিজেদের চালানো কনটেন্ট সাইটেই চলছে, আমাদের সঙ্গে কথা বলতে পারেন।

এই ধরনের খুঁটিনাটি আমরা সার্ভিস বানিয়ে ফেলেছি

lastmod-এর সততা সেই ধরনের সূচক যা কেউ খুঁজে দেখে না, কিন্তু খুঁজলেই বোঝা যায় কাজটা মন দিয়ে হয়েছে কি না। আমাদের নিজেদের সাইটের sitemap কনটেন্ট হ্যাশ স্টেট মেশিন দিয়েই তৈরি, বদলালে তবেই তারিখ নড়ে।

প্ল্যান ফি কী কী থাকছে
সেটআপ $900 USDT সাইট আর্কিটেকচার, টেকনিক্যাল SEO, প্রাথমিক কনটেন্ট
মাসিক রক্ষণাবেক্ষণ $400 USDT / মাস কনটেন্ট উৎপাদন, ইন্টারনাল লিঙ্ক রক্ষণাবেক্ষণ, ইনডেক্স মনিটরিং

স্পেসিফিকেশন আছে iGaming SEO সাইট বিল্ড সার্ভিস পাতায়।

এই ধরনের সমস্যা আমরা প্রতিদিন সমাধান করি

আপনার পরিস্থিতি জানান, আমরা সরাসরি বলব এটা সম্ভব কিনা এবং আনুমানিক খরচ কত।

Telegram-এ আলাপ করুন
মূল্যায়ন ও কোটেশন বিনামূল্যে · উত্তর দেবেন ইঞ্জিনিয়ার নিজেই
TG-তে আলাপ করুন