5 ข้อผิดพลาดลับใน Sitemap.xml: ทำไม Google ถึงมองข้ามหน้าเว็บของคุณ
ขอบเขตทางเทคนิค: บทความนี้มุ่งเน้นไปที่ Next.js App Router (
sitemap.ts), การสร้าง XML ด้วย Node.js และกับดักทั่วไปที่เกิดจากการใช้ AI Code Assistant (Cursor, Copilot, ChatGPT)
ในที่สุดแอปพลิเคชัน Next.js ของคุณก็ถูกนำไปใช้งานจริง (deploy) UI ดูไร้ที่ติ ฟีเจอร์ครบถ้วน และคะแนน Lighthouse ก็เป็นสีเขียว แต่สองสัปดาห์ต่อมา Google Search Console ยังคงจ้องมองคุณกลับมาด้วยตัวเลขอันน่าสะพรึงกลัว: “0 หน้าที่ถูกจัดทำดัชนี”
คุณจำได้ว่าเคยใช้ตัวช่วย AI เพื่อสร้างลอจิกการกำหนดเส้นทาง (routing) ในเวลาประมาณห้าวินาที มันดูถูกต้อง มันคอมไพล์ผ่าน แต่ภายใต้เปลือกนอกนั้น vibe-coding เพิ่งจะทำลาย SEO ทางเทคนิคของคุณไป ยูทิลิตี้ sitemap.xml ที่ AI สร้างขึ้นมีข้อผิดพลาดลับ 5 ประการที่ควรระวัง และนี่คือวิธีแก้ไข
ภาพลวงตาของ XML อันแสนง่าย
Vibe-coding ทำให้การสร้างแผนผังเว็บไซต์ (sitemap) ดูเหมือนเป็นเรื่องเล็กน้อย คุณสั่งงานว่า: “สร้าง sitemap สำหรับบล็อก Next.js ของฉัน” LLM จะพ่นไฟล์ sitemap.ts ออกมาให้ทันที
แต่ลอจิกของ AI ทำงานอย่างมืดบอด มันไม่ได้ตรวจสอบระบบไฟล์จริง ไม่ได้คิวรีฐานข้อมูลเพื่อยืนยันว่าสินค้ายังมีอยู่จริง และที่สำคัญที่สุดคือมันไม่เข้าใจข้อจำกัดด้านขนาดของเครื่องมือค้นหา มันสร้างโค้ดที่โครงสร้างดูดีแต่ทำลายลอจิกของการทำงานอย่างย่อยยับ
Critical — การสิ้นเปลืองงบประมาณในการรวบรวมข้อมูล (Crawl Budget) — ความล้มเหลวทางสถาปัตยกรรม
URL ผี (404 ใน Sitemap)
ข้อผิดพลาดที่พบบ่อยที่สุดของ LLM คือการทึกทักเอาเองว่าอาร์เรย์เส้นทาง (route) ของคุณจะเป็นความจริงตลอดไป หากคุณขอให้ AI วนซ้ำ (map) อาร์เรย์ของ slug มันมักจะรวมเส้นทางเก่าที่คุณลบหรือเปลี่ยนชื่อไปแล้วในระหว่างการปรับปรุงโค้ด (refactoring)
โค้ด AI ที่แย่:
// AI ฮาร์ดโค้ดเส้นทางเก่าหรือไม่ได้ตรวจสอบว่าข้อมูลในฐานข้อมูลถูก 'เผยแพร่' (published) หรือไม่
const routes = ["/blog/old-slug", "/blog/new-slug"];
return routes.map((route) => ({ url: `https://example.com${route}` }));
ผลกระทบ: URL ผี แผนผังเว็บไซต์นำเสนอหน้าเว็บต่อ Google อย่างภาคภูมิใจทั้งที่หน้าเหล่านั้นคืนค่า 404 Not Found ตัวรวบรวมข้อมูลของ Google สิ้นเปลืองงบประมาณไปกับการชนทางตัน ซึ่งจะลดคะแนนความน่าเชื่อถือของโดเมนทั้งหมดของคุณลงอย่างมาก
Critical — การลดประสิทธิภาพของสัญญาณ — การบิดเบือนข้อมูลเมตา (Metadata)
สแปมแบบไดนามิกใน <lastmod>
หากคุณขอให้ AI เพิ่มคุณสมบัติ lastModified ใน sitemap.ts ของ Next.js มันมักจะเลือกใช้วิธีที่ง่ายที่สุดของ JavaScript เสมอ นั่นคือ new Date()
โค้ด AI ที่แย่:
// AI สร้างวันที่ปัจจุบันแบบไดนามิกในทุกครั้งที่ deploy
return {
url: "https://example.com/about",
lastModified: new Date(),
changeFrequency: "monthly",
};
ผลกระทบ: แท็ก <lastmod> ควรบอก Google ว่าเนื้อหานั้นถูกเปลี่ยนแปลง จริง ๆ เมื่อใด หากคุณใช้ new Date() คุณกำลังอัปเดตวันที่ในทุก ๆ การ build หรือการเรนเดอร์ของเซิร์ฟเวอร์ Google จะตรวจพบความไม่สอดคล้องกันของข้อมูลเมตานี้เมื่อเวลาผ่านไป และจะตีความพฤติกรรมนี้ว่าเป็นการบิดเบือนข้อมูลสำหรับเนื้อหาที่ไม่มีการเปลี่ยนแปลง และจะหยุดเชื่อถือสัญญาณ lastmod ของคุณถาวร
High — การปฏิเสธการจัดทำดัชนี — ข้อผิดพลาดทางไวยากรณ์ XML
แท็กหายและโครงสร้าง XML พัง
เมื่อมีการใช้ AI เพื่อสร้างสตริง XML ด้วยตนเอง (มักพบใน Node.js streaming API หรือ Custom Express endpoint) บ่อยครั้งที่ AI จะลืมแท็กปิด
โค้ด AI ที่แย่:
let xml = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`;
urls.forEach((url) => {
// แท็กปิด </loc> หายไป: ควรจะเป็น <loc>${url}</loc>
xml += `<url><loc>${url}</url>`;
});
// แท็กปิด </urlset> หายไป
ผลกระทบ: Google Search Console ตรวจสอบ XML อย่างเข้มงวด เพียงแค่แท็ก </loc> หายไปเพียงแท็กเดียว หรือมีเครื่องหมายแอมเปอร์แซนด์ (&) ที่ไม่ได้ทำ escape ใน URL ก็จะทำให้ไฟล์ทั้งหมดใช้งานไม่ได้ และขัดขวางไม่ให้ Google ค้นพบหน้าเว็บทั้งหมดของคุณ
Medium — ความขัดแย้งของ Canonical URL — การจัดการ URL
โปรโตคอลผสม (HTTP vs HTTPS)
AI ชอบการแทรกสตริง (string interpolation) และไม่ค่อยคำนึงถึงบริบทของสภาพแวดล้อม (environment) เว้นแต่จะได้รับคำสั่งอย่างชัดเจน
โค้ด AI ที่แย่:
// AI ฮาร์ดโค้ด http แทนที่จะใช้ไดนามิกเฮดเดอร์หรือตัวแปร env
const domain = process.env.DOMAIN || "example.com";
const url = `http://${domain}/pricing`;
ผลกระทบ: หากไซต์จริงของคุณบังคับใช้ HTTPS แต่แผนผังเว็บไซต์ของคุณประกาศ URL เป็น HTTP Google จะมองว่าสิ่งเหล่านี้เป็นเอนทิตีที่แยกจากกัน ซึ่งจะทำให้เกิดปัญหาเนื้อหาซ้ำซ้อน การแจ้งเตือนเชนการเปลี่ยนเส้นทาง (redirect chain) ใน Search Console และความไม่สอดคล้องของ Canonical URL
Critical — การหยุดจัดทำดัชนีโดยสมบูรณ์ — ความล้มเหลวในการขยายขนาด
การเพิกเฉยต่อขีดจำกัดของ Google
หากคุณขอให้ AI สร้างแผนผังเว็บไซต์สำหรับไซต์อีคอมเมิร์ซที่มีผลิตภัณฑ์ 150,000 รายการ AI จะพ่นอาร์เรย์ขนาดใหญ่ออกมาเพียงชุดเดียวอย่างมีความสุข
ผลกระทบ: Google มีขีดจำกัดที่เข้มงวด: 50,000 URL หรือ 50MB (แบบไม่บีบอัด) ต่อไฟล์แผนผังเว็บไซต์หนึ่งไฟล์ อาร์เรย์แบบแบนขนาดใหญ่ขัดต่อกฎนี้ ตัวแยกส่วน (parser) จะค้าง แผนผังเว็บไซต์จะถูกปฏิเสธ และแคตตาล็อกสินค้าของคุณจะไม่ถูกจัดทำดัชนีโดยไม่แจ้งเตือน คุณต้องสั่งให้ AI ใช้สถาปัตยกรรม “Sitemap Index” เพื่อแบ่ง URL ออกเป็นไฟล์ย่อย ๆ หลายไฟล์ตามข้อกำหนด
Fact-Check: แผนผังเว็บไซต์ที่สร้างโดยอัตโนมัติ
- หลักฐาน: ในสถาปัตยกรรม Next.js ไฟล์
sitemap.tsแบบสแตติกมักจะถูกสร้างขึ้นเพียงครั้งเดียวในขณะ build การใช้new Date()เป็นเพียงการฮาร์ดโค้ดเวลา build ลงไป ซึ่งทำให้การทำงานแบบไดนามิกนั้นมีข้อบกพร่องทางเทคนิค - หลักฐาน: Google Search Central กำหนดขีดจำกัด 50MB และ 50,000 URL ไว้อย่างชัดเจน โดยกำหนดให้ต้องใช้ Sitemap Indexing สำหรับแอปพลิเคชันขนาดใหญ่
- ความเห็น: จากประสบการณ์ของเรา โปรแกรมช่วย AI ให้ความสำคัญกับการสร้างโค้ดที่ ใช้งานได้ (compile) มากกว่าโค้ดที่ เป็นไปตาม (comply) แนวทางปฏิบัติสำหรับเจ้าของเว็บไซต์ภายนอก
การตรวจสอบอัตโนมัติด้วย WebValid
ตัวช่วย AI ของคุณไม่ได้ประสงค์ร้าย แต่มันแค่ขาดบริบทในการทำงานจริง เมื่อคุณรัน WebValid ตัว sitemap-scanner จะตรวจสอบ XML ที่สร้างขึ้นในเวลาเพียงเสี้ยววินาที
| รูปแบบข้อผิดพลาด | ความสามารถของ WebValid |
|---|---|
| URL ผี | ตรวจสอบทุกลิงก์โดยอัตโนมัติเพื่อหาลิงก์เสีย |
สแปม lastmod แบบไดนามิก | ระบุรูปแบบของเวลาอัปเดตที่เหมือนกันทั้งไฟล์ |
| โปรโตคอลพัง | ตรวจหาเนื้อหาที่มีโปรโตคอลผสมกันในสภาพแวดล้อม HTTPS |
| ขีดจำกัดของ Google | ตรวจสอบขนาดไฟล์และขีดจำกัด URL อย่างเข้มงวดก่อน deploy |
WebValid ตรวจสอบการตอบสนองของ HTTP และ XML ที่แยกวิเคราะห์แล้ว มันไม่ได้เขียน Next.js route handler ให้คุณใหม่ แต่มันให้บริบทของข้อผิดพลาดที่ AI ของคุณต้องการเพื่อนำไปแก้ไขเอง
รายการตรวจสอบ Sitemap ของคุณ
เทมเพลตพรอพสำหรับคัดลอกไปใช้ในตัวช่วย AI ของคุณ:
- ตรวจสอบ 404: ตรวจสอบว่าทุก URL ในแผนผังเว็บไซต์ตรงกับเส้นทางจริงที่คืนค่า 200 OK
- แก้ไข
<lastmod>: ดึงวันที่มาจากฟิลด์updatedAtในฐานข้อมูลจริง ไม่ใช่new Date() - ตรวจสอบ XML: ใช้ตัวตรวจสอบ XML ที่เข้มงวดกับผลลัพธ์ที่จะใช้งานจริง
- Sitemap Index: หากมีมากกว่า 45,000 URL (ขีดจำกัดของ Google คือ 50,000 การแบ่งล่วงหน้าช่วยให้มีระยะปลอดภัย) ให้ใช้โครงสร้าง Sitemap Index
ตัวช่วย AI ของคุณสามารถเขียนโค้ดที่ดีได้ แต่มันแค่ไม่รู้ว่ามันทำผิดตรงไหน มอบรายการข้อผิดพลาดจาก WebValid ให้มัน แล้วมันจะแก้ไขทุกอย่างด้วยตัวเอง