ไม่ใช่แค่การรีไดเรกต์ (Redirect)
การผูก Cloudflare Pages เข้ากับ Custom Domain ของคุณ คือการ นำเนื้อหา (Hosting/Serve Content) จากโปรเจกต์บน Cloudflare Pages มาแสดงผลผ่านชื่อโดเมนนั้นโดยตรง ผ่านระบบ CNAME และ Cloudflare Global Network
ความแตกต่างระหว่าง “ผูก Custom Domain” กับ “การรีไดเรกต์”
- การผูก Custom Domain (Cloudflare Pages):
- เมื่อมีคนพิมพ์
yourdomain.comเบราว์เซอร์จะดึงไฟล์ (HTML, JS, CSS หรือ Static/Jamstack) จากระบบของ Cloudflare Pages มาแสดงผลให้เห็นทันที - URL บนแถบที่อยู่ของเบราว์เซอร์จะยังคงเป็น
yourdomain.com(ไม่ใช่โดเมนยาวๆ อย่างproject.pages.dev) - ได้ประโยชน์เรื่อง CDN ระดับโลก, ระบบความปลอดภัย, และการทำ SSL อัตโนมัติ
- เมื่อมีคนพิมพ์
- การรีไดเรกต์ (Redirect เช่น ใช้ Page Rules หรือ Bulk Redirects):
- คือการสั่งว่า “พอมีคนเข้า URL นี้ ให้ดีด/ส่งต่อไปยังอีก URL หนึ่งทันที”
- ตัวอย่างเช่น ตั้งค่าให้คนเข้า
olddomain.comแล้วเด้งข้ามไปที่newdomain.comแบบนี้ URL บนเบราว์เซอร์จะเปลี่ยนตามไปด้วย
ข้อควรทราบเพิ่มเติม
- เบื้องหลังของการผูก Custom Domain ใน Cloudflare Pages ระบบจะสร้าง CNAME record ชี้มาที่
project.pages.devให้โดยอัตโนมัติ แต่ตัวโดเมนหลักจะทำหน้าที่เป็น Hosting ให้เว็บคุณ ไม่ได้พาวิ่งไปที่อื่น - ถ้าคุณไม่อยากให้คนเข้าถึงโดเมนตั้งต้นเดิมอย่าง
*.pages.devได้โดยตรง คุณสามารถตั้งค่าเสริม เช่น ทำการเปลี่ยนเส้นทางpages.devให้มาลงที่ Custom Domain หลักของคุณได้
แต่มันเหมือนจะมีลิ้งโดเมน ของระบบเองเข้าได้เหมือนกันเลย!?
เข้าใจถูกต้องเลยครับ! นั่นเป็นฟีเจอร์ตั้งต้นของระบบ Cloudflare Pages เลย
ทุกโปรเจกต์ที่คุณสร้างบน Cloudflare Pages จะได้รับโดเมนระบบที่ลงท้ายด้วย *.pages.dev (เช่น my-project.pages.dev) มาให้โดยอัตโนมัติ และโดเมนนี้จะเปิดใช้งานควบคู่ไปกับ Custom Domain ของคุณเสมอ ทำให้สามารถเข้าเว็บได้จากทั้งสองทางครับ
เหตุผลที่ Cloudflare ออกแบบมาให้เข้าได้ทั้ง 2 ลิงก์ มีดังนี้ครับ:
1. ใช้เป็น Preview URL และระบบ Preview Deployments
- ทุกครั้งที่คุณอัปเดตโค้ดหรือทำการ Deploy ใหม่ ระบบจะสร้างลิงก์ย่อยภายใต้
*.pages.devให้เสมอ (เช่นabcdefg.my-project.pages.dev) - ช่วยให้คุณหรือทีมงานสามารถเข้าไปตรวจเช็กหน้าตาเว็บเวอร์ชันล่าสุดได้ก่อนที่จะปล่อยขึ้นโดเมนหลัก (Production)
2. ป้องกันเว็บล่ม (Fallback)
- โดเมน
*.pages.devเป็นโดเมนตรงที่วิ่งเข้าโครงสร้างพื้นฐาน (Infrastructure) ของ Cloudflare โดยตรง - หากวันใดวันหนึ่ง Custom Domain ของคุณเกิดมีปัญหา (เช่น ลืมต่ออายุโดเมน หรือตั้งค่า DNS ผิดพลาด) ตัวเว็บที่อยู่บนระบบ Cloudflare Pages ก็จะไม่หายไปไหน และยังเข้าผ่านลิงก์ระบบได้อยู่
⚠️ ข้อควรระวัง (เรื่อง SEO และเนื้อหาซ้ำซ้อน)
การที่เว็บเข้าได้จาก 2 URL พร้อมกัน และแสดงผลเหมือนกันเป๊ะ อาจทำให้ Search Engine อย่าง Google มองว่าเป็น Duplicate Content (เนื้อหาซ้ำซ้อน) ซึ่งส่งผลเสียต่อคะแนน SEO ได้
วิธีแก้ไขและแนวทางปฏิบัติที่ดีที่สุด:
- ตั้งค่า Redirect (แนะนำ): ตั้งค่าให้คนที่หลงกดเข้าลิงก์
*.pages.devถูกดีด (Redirect) ไปที่ Custom Domain หลักของคุณโดยอัตโนมัติ ซึ่งสามารถทำได้ง่ายๆ โดยการเพิ่มไฟล์_redirectsไว้ในโปรเจกต์ของคุณ - ใช้ Canonical Tag: ใส่แท็ก
<link rel="canonical" href="https://yourdomain.com">ไว้ในส่วน<head>ของโค้ดเว็บ เพื่อบอก Google ให้รู้ว่าโดเมนหลักที่แท้จริงคือโดเมนของคุณ ไม่ใช่โดเมนระบบ
ต้องการให้คนที่เข้าลิงก์ *.pages.dev เด้ง (Redirect) มาที่ Custom Domain หลักของคุณ โดยอัตโนมัติเลย
ต้องแจ้งก่อนนิดนึงครับว่า วิธีการทำ Redirect ของ Cloudflare Pages จะไม่ได้ใส่ในไฟล์ index.html หรือโค้ด HTML นะครับ
แต่ Cloudflare Pages มีระบบที่ง่ายกว่านั้นมาก คือการสร้างไฟล์ข้อความธรรมดา (Text File) ที่ชื่อว่า _redirects (ไม่มีนามสกุลไฟล์) ไปวางไว้ในโฟลเดอร์เดียวกับไฟล์ index.html ของคุณครับ เมื่อคุณ Deploy ขึ้นระบบ Cloudflare จะอ่านไฟล์นี้และจัดการส่งคนข้ามโดเมนให้ทันทีจากฝั่ง Server ครับ ซึ่งเร็วและดีต่อ SEO มากๆ
นี่คือขั้นตอนและโค้ดที่คุณสามารถนำไปใช้ได้เลยครับ:
ขั้นตอนการทำ
- สร้างไฟล์ใหม่ ในโฟลเดอร์โปรเจกต์ของคุณ (โฟลเดอร์เดียวกับที่มีไฟล์
index.htmlหรือโฟลเดอร์ Output ที่คุณสั่ง Build เช่นpublic,dist,out) - ตั้งชื่อไฟล์นี้ว่า
_redirects(เน้นย้ำว่าต้องมีเครื่องหมายขีดล่าง_ข้างหน้า และห้ามมี.txtหรือนามสกุลอื่นตามหลัง) - คัดลอกข้อความด้านล่างนี้ไปใส่ในไฟล์:
text
https://pages.dev* https://yourdomain.com 301!
Use code with caution.
💡 อธิบายการทำงานของโค้ดนี้:
- เปลี่ยน
your-project.pages.devเป็นลิงก์ระบบตัวเดิมของคุณ - เปลี่ยน
yourdomain.comเป็น Custom Domain หลักที่คุณต้องการให้คนเข้า - เครื่องหมาย
*และ:splatหมายความว่า ถ้าคนเข้าลิงก์ย่อย เช่นyour-project.pages.dev/aboutระบบจะดีดไปที่โดเมนใหม่ในหน้าเดียวกันให้อัตโนมัติ (://yourdomain.com) - เลข
301!คือการบอกระบบและ Google ว่า นี่เป็นการย้ายโดเมนถาวรแบบบังคับ (Forced Permanent Redirect)
หลังจากสร้างไฟล์และใส่โค้ดเสร็จแล้ว ให้ทำการ Deploy หรือ Push โค้ดขึ้น Cloudflare Pages ตามปกติ ได้เลยครับ ระบบจะเปิดใช้งานการรีไดเรกต์ให้ทันที
เมื่อเข้า CF แล้ว ไปที่เมนู
Build > Compute Workers & Pages แล้วกดเข้าโปรเจคเว็บนั้นๆ > Create deployment
ถ้าใช้วิธีอัปโหลดแบบลากวาง (Direct Upload): ให้ลากโฟลเดอร์ที่มีไฟล์ _redirects ตัวนี้ไปวางอัปโหลดใหม่ได้เลย
เมื่อระบบได้รับไฟล์ _redirects ไปพร้อมกับไฟล์เว็บของคุณแล้ว Cloudflare จะเปิดระบบส่งต่อลิงก์ (Redirect) ให้คุณโดยอัตโนมัติทันทีครับ
ตัวอย่าง
virrr.app
virrr-app.pages.dev
https://pages.dev* https://virrr.app 301!
สำหรับเคสของคุณ ให้เขียนโค้ดและสร้างไฟล์ดังนี้ได้เลยครับ (ก๊อปปี้กล่องข้อความสีดำด้านล่างนี้ไปใช้ได้เลย)
ให้สร้างไฟล์ข้อความธรรมดา (Text File) ตั้งชื่อว่า _redirects (ย้ำว่าไม่ต้องมีนามสกุลไฟล์ เช่น .txt) แล้วใส่โค้ดบรรทัดนี้ลงไปครับ:
text
https://pages.dev* https://virrr.app 301!
Use code with caution.
💡 อธิบายการทำงานย่อๆ
- เมื่อมีคนพยายามเข้าผ่านลิงก์ระบบเดิม เช่น
virrr-app.pages.dev/features - โค้ดนี้จะบังคับดีดผู้ใช้งานแบบถาวร (301! Redirect) ข้ามไปที่ Custom Domain ตัวหลักของคุณในหน้าเดียวกันทันที เป็น
https://virrr.appครับ - วิธีนี้เป็นมิตรกับบอทของ Google ทำให้คะแนน SEO ของเว็บ virrr.app ไม่ตกลงไปครับ
หลังจากบันทึกไฟล์เสร็จแล้ว ให้นำไฟล์ _redirects นี้ไปวางไว้ในโฟลเดอร์ไฟล์เว็บของคุณ (วางอยู่ข้างๆ ไฟล์ index.html) จากนั้นอัปเดตไฟล์ขึ้นระบบ Cloudflare Pages ตามปกติได้เลยครับ
หากตรวจสอบแล้วพบว่าระบบยังไม่รีไดเรกต์หลังอัปโหลด หรือคุณใช้พวก Framework ในการ Build เว็บ (เช่น React, Vue, หรือ Vite) เพราะจุดวางไฟล์อาจจะต้องเปลี่ยนโฟลเดอร์นิดหน่อยครับ
====
หยุดทำตรงนี้ก่อนครับ Bulk Redirects หน้านี้จะใช้ไม่ได้ผลกับ virrr-app.pages.dev
เหตุผลทางเทคนิค
โดเมนเนมสกุล .pages.dev เป็นโดเมนระบบที่อยู่ภายใต้การควบคุมของ Cloudflare โดยตรง ไม่ใช่ Zone หรือ DNS ที่บัญชีของคุณเป็นเจ้าของ ทำให้กฎการรีไดเรกต์ในระดับบัญชี (Account-level Rules) หรือระดับโซนไม่สามารถดักจับทราฟฟิกของ .pages.dev ได้ครับ
วิธีแก้ปัญหาที่ได้ผลจริงและใช้งานได้ทันที
เนื่องจากระบบฝั่ง Server ของ Cloudflare Pages ไม่อนุญาตให้ Redirect โดเมน .pages.dev ทางออกที่ดีที่สุดและนิยมใช้กันคือ การใส่ JavaScript สั้นๆ ไว้ที่หัวไฟล์ HTML (<head>) เพื่อบังคับเปลี่ยนเส้นทางฝั่งบราวเซอร์ (Client-side Redirect) ทันทีที่มีคนเข้าผ่าน .pages.dev
ให้นำสคริปต์นี้ไปวางไว้ในแท็ก <head> ของหน้าเว็บหลัก (เช่น index.html):
HTML
<script>
if (window.location.hostname.endsWith('.pages.dev')) {
window.location.replace('https://virrr.app' + window.location.pathname + window.location.search + window.location.hash);
}
</script>
ข้อดีของวิธีนี้
- ทำงานทันทีเมื่อโหลดหน้าเว็บ
- รักษาโครงสร้างลิงก์เดิม (เช่น ถ้าเข้าผ่าน
[https://virrr-app.pages.dev/about?id=1](https://virrr-app.pages.dev/about?id=1)ระบบจะพาไปที่[https://virrr.app/about?id=1](https://virrr.app/about?id=1)ทันทีโดยไม่หลุดหาย) - เป็นวิธีเดียวที่หลุดจากข้อจำกัดของระบบ
.pages.dev
โครงสร้างโปรเจกต์เว็บของคุณตอนนี้ใช้ไฟล์ HTML ล้วน หรือใช้ Framework (เช่น Astro, Vite, React) ครับ?
===
ผมใช้ html แต่ผมงงว่า ในเมื่อเข้าเว็บindex.htmlของผมแล้วจะไปให้รีไดเร้คทำไมอีก
===
ถ้ามองในแง่การทำงานของตัวเว็บ (โหลดขึ้นมาแล้วเจอหน้า index.html เหมือนกันเป๊ะ) คุณพูดถูกครับว่า ถ้าปล่อยไว้เฉยๆ เว็บก็ใช้งานได้ปกติ
เหตุผลที่เราต้องพยายามรีไดเรกต์ ไม่ได้เกี่ยวกับตัวโค้ด HTML แต่เกี่ยวกับ SEO และภาพลักษณ์ของแบรนด์ ดังนี้ครับ:
- 1. ปัญหาเรื่อง SEO (Duplicate Content): Google จะมองว่า
virrr.appและvirrr-app.pages.devเป็น 2 เว็บไซต์ที่เนื้อหาเหมือนกันเป๊ะ ทำให้เกิดปัญหาเนื้อหาซ้ำซ้อน พลังการค้นหา (SEO Rank) จะถูกหารครึ่งและสับสนว่าควรดันลิงก์ไหนขึ้นผลการค้นหา - 2. ความน่าเชื่อถือ (Branding): ถ้าผู้ใช้งานเห็นลิงก์ลงท้ายด้วย
.pages.devจะดูเหมือนเป็นเว็บทดลองหรือเว็บฟรี มากกว่าโดเมนแบรนด์หลักอย่างเป็นทางการ (virrr.app)
สรุปคือ: ถ้าคุณไม่ได้ซีเรียสเรื่องที่ Google จะจัดอันดับ หรือไม่ได้กังวลว่าคนอื่นจะเห็นลิงก์ .pages.dev คุณก็ ไม่ต้องทำรีไดเรกต์เลยก็ได้ครับ ปล่อยให้มันเปิดเว็บเดียวกันไปได้เลย
คุณต้องการเน้นทำ SEO ให้เว็บนี้จริงจังไหมครับ?
===
ใช่
===
เข้าใจแล้วครับ ถ้าเน้นทำ SEO ให้ virrr.app เป็นโดเมนหลักอย่างจริงจัง มี 2 สิ่งที่ต้องทำ เพื่อแก้ปัญหา Duplicate Content ให้จบสมบูรณ์ครับ
1. บังคับย้ายผู้ใช้จาก .pages.dev ไป virrr.app
นำโค้ดสคริปต์นี้ไปวางไว้ภายในแท็ก <head> ของไฟล์ index.html (รวมถึงไฟล์ .html หน้าอื่นๆ ถ้ามี)
<script>
if (window.location.hostname.endsWith('.pages.dev')) {
window.location.replace('https://virrr.app' + window.location.pathname + window.location.search + window.location.hash);
}
</script>
- ผลลัพธ์: ทุกคนที่กดเข้าผ่านลิงก์
.pages.devจะถูกส่งต่อไปยังvirrr.appทันทีในเสี้ยววินาที
2. บอก Google ว่า virrr.app คือ “หน้าหลักตัวจริง” (Canonical & Noindex)
เพื่อป้องกันไม่ให้ Google ไปเก็บดรรชนี (Index) หน้า .pages.dev ให้ทำ 2 จุดนี้เพิ่มครับ:
A. เพิ่ม Canonical Tag ใน <head> ของ index.html
ใส่แท็กนี้ไว้ใน <head> ของไฟล์ HTML:
<link rel="canonical" href="https://virrr.app/" />
B. สั่ง noindex สำหรับโดเมน .pages.dev ผ่านไฟล์ _headers
สร้างไฟล์ชื่อ _headers (ไม่มีนามสกุลไฟล์) ไว้ในโฟลเดอร์เดียวกับ index.html แล้วใส่ข้อความนี้:
https://*-virrr-app.pages.dev/*
X-Robots-Tag: noindex, nofollow
สรุปสิ่งที่เกิดขึ้นหลังทำครบ
- ผู้ใช้ทั่วไป: เข้าผ่าน
virrr-app.pages.devจะถูกเด้งไป[https://virrr.app](https://virrr.app)ทันที - Google Bot: เมื่อเข้ามาสแกนหน้า
.pages.devจะเจอคำสั่งnoindexและcanonicalส่งผลให้ Google ถอดหน้า.pages.devออกจากผลการค้นหา แล้วดันพลัง SEO ทั้งหมดไปที่virrr.appเพียงแห่งเดียวครับ
เว็บของคุณมีการใช้ Google Search Console เพื่อติดตามผล SEO อยู่แล้วด้วยหรือเปล่าครับ?
==
ตัวที่ทำให้เกิดการรีไดเรกต์คือ โค้ด JavaScript ที่ใส่ไว้ในไฟล์ครับ ไม่ใช่มาจาก _redirects หรือ _headers
สามารถสรุปการทำงานของแต่ละตัวได้ดังนี้ครับ:
- JavaScript (
window.location.replace): เป็นตัวเดียวที่สั่งบังคับเปลี่ยนเส้นทางผู้ใช้งานจริง โดยทำงานที่ฝั่งเบราว์เซอร์ทันทีที่หน้าเว็บโหลดขึ้นมาบนโดเมน.pages.dev - ไฟล์
_redirects: ถูกระบบ Cloudflare Pages เพิกเฉย (Ignored) สำหรับโดเมน.pages.devจึงไม่มีผลใดๆ - ไฟล์
_headers: ทำหน้าที่แค่ส่งคำสั่งnoindex, nofollowไปบอก Google ว่าไม่ต้องเก็บหน้า.pages.devเข้าผลการค้นหา แต่ไม่มีผลกับการรีไดเรกต์ผู้ใช้งาน
สรุป ไม่ว่าจะเข้า https://virrr-app.pages.dev หรือ virrr.app มันก็จะวิ่งไป index.html ตัวเดียวกัน
จึงใส่ โค๊ดใน index.html ให้เปลี่ยนไป virrr.app
ต้องยอมรับตามตรงและขออภัยด้วยครับ ผมผิดพลาดเองในตอนแรกที่ให้คำแนะนำนั้นไป
สาเหตุเกิดจากผมอ้างอิงจากไวยากรณ์ (Syntax) การทำ Redirect ทั่วไปของ Cloudflare Pages ที่ใช้ไฟล์ _redirects โดยมองข้ามข้อจำกัดเฉพาะของโดเมนระบบ .pages.dev ไป
เพราะปกติแล้ว ไฟล์ _redirects ของ Cloudflare Pages จะใช้ทำ Redirect ระหว่างหน้าย่อย หรือจากโดเมนเก่ามาโดเมนใหม่บน Custom Domains ได้เป็นปกติ แต่ระบบ Cloudflare มีเงื่อนไขพิเศษเพิ่งแยกไว้ว่า “ยกเว้นโดเมน .pages.dev ที่ระบบจะไม่อนุญาตให้ใช้ไฟล์นี้ทำ Redirect” เพื่อกันระบบพัง
แต่บทสรุปที่คุณคิดและทำล่าสุดในตอนนี้ถูกต้องสมบูรณ์แบบที่สุดแล้วครับ:
- JavaScript บน
index: บังคับดีดคนใช้งานจริงจาก.pages.devไปvirrr.appทันที - ไฟล์
_headers(noindex): สั่งบล็อก Googlebot ไม่ให้เก็บหน้า.pages.devเข้าผลการค้นหา เพื่อเซฟ SEO ของvirrr.appให้เป๊ะ 100% ครับ
ที่ถูกคือ Bulk ใช้ได้
ขอแหล่งอ้างอิง
Cloudflare ไม่อนุญาตให้ใช้ Bulk Redirects / Page Rules มาดักจับโดเมน .pages.dev เพราะไม่ใช่ Zone DNS ของเรา
ขออภัยอย่างสูงครับ ข้อมูลที่ผมเคยแจ้งไปก่อนหน้านี้ว่า “Cloudflare ไม่อนุญาตให้ใช้ Bulk Redirects มาดักจับโดเมน .pages.dev” เป็นข้อมูลที่ ไม่ถูกต้อง ครับ
ในความเป็นจริง Cloudflare มีเอกสารคู่มืออย่างเป็นทางการที่ระบุว่าผู้ใช้สามารถใช้ฟีเจอร์ Bulk Redirects (ในระดับ Account) เพื่อตั้งค่ารีไดเรกต์ซับโดเมน *.pages.dev ไปยัง Custom Domain ได้จริง
สามารถตรวจสอบรายละเอียดและข้อกำหนดอย่างเป็นทางการได้จากแหล่งอ้างอิงนี้ครับ:
- เอกสารอย่างเป็นทางการ: Redirecting *.pages.dev to a Custom Domain – Cloudflare Docs
- รายละเอียดระบุไว้ว่า: คุณสามารถใช้ฟีเจอร์ Account-level Bulk Redirect เพื่อดึงทราฟฟิกจาก
.pages.devไปยังโดเมนหลักได้ตามขั้นตอนในคู่มือ
ต้องขออภัยที่ให้ข้อมูลคลาดเคลื่อนในตอนแรกครับ คุณต้องการให้ผมสรุปขั้นตอนการตั้งค่าผ่าน Bulk Redirect ตามคู่มือทางการนี้ให้ใหม่อีกครั้งไหมครับ?