คำตอบสั้น ๆ: เขียนกฎ 301 Redirect ในไฟล์ .htaccess สำหรับย้ายหน้า ย้ายโฟลเดอร์ บังคับ HTTPS รวมโดเมน www และย้ายโดเมน โดยไม่เสียอันดับ SEO
คู่มือนี้อธิบาย 301 Redirect ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
301 Redirect คือการบอกเบราว์เซอร์และ Search Engine ว่า URL นี้ย้ายไปอยู่ที่ใหม่อย่างถาวร Google จะค่อยๆ โอนสัญญาณการจัดอันดับจาก URL เดิมไปยัง URL ใหม่ ส่วนผู้เข้าชมที่คลิกลิงก์เก่าจะถูกพาไปหน้าใหม่โดยอัตโนมัติ จึงเป็นเครื่องมือหลักเมื่อเปลี่ยนโครงสร้าง URL, ย้ายหน้า, รวมหน้า หรือย้ายโดเมน
บนเว็บที่ใช้ Apache หรือ LiteSpeed (รวมถึงโฮสติ้ง Plesk และ DirectAdmin ส่วนใหญ่) วิธีที่สะดวกที่สุดคือเขียนกฎในไฟล์ .htaccess ที่อยู่ในโฟลเดอร์รากของเว็บ ไม่ต้องแก้ไฟล์ตั้งค่าของระบบและมีผลทันทีโดยไม่ต้องรีสตาร์ต
สิ่งที่ต้องเตรียม (301 Redirect)
- สิทธิ์แก้ไขไฟล์ในโฟลเดอร์เว็บ (
httpdocsบน Plesk,public_htmlบน DirectAdmin) ผ่าน File Manager, SFTP หรือ SSH - เว็บต้องรันบน Apache หรือ LiteSpeed ถ้าเป็น Nginx ล้วน ไฟล์
.htaccessจะไม่มีผล ให้ดู ทำ 301 Redirect บน Nginx แทน - รายการ URL เดิมและ URL ใหม่ที่ต้องการจับคู่ ควรทำเป็นตารางก่อนเริ่ม
- สำเนาของไฟล์
.htaccessเดิม เพราะไฟล์ที่พิมพ์ผิดเพียงบรรทัดเดียวทำให้ทั้งเว็บขึ้น 500 Error ได้
ทำความรู้จักสองวิธีในการเขียน Redirect (301 Redirect)
| วิธี | โมดูล | เหมาะกับ |
|---|---|---|
Redirect / RedirectMatch | mod_alias | ย้ายหน้าทีละหน้า เขียนง่าย อ่านง่าย |
RewriteCond + RewriteRule | mod_rewrite | เงื่อนไขตามโดเมน, HTTPS, Query String หรือรูปแบบซับซ้อน |
ถ้าเว็บใช้ RewriteRule อยู่แล้ว เช่น WordPress, Laravel หรือ CMS ส่วนใหญ่ แนะนำให้เขียน Redirect ด้วย mod_rewrite ทั้งหมด เพราะเมื่อใช้สองโมดูลปนกัน ลำดับการทำงานไม่ได้เป็นไปตามลำดับบรรทัดในไฟล์ และอาจได้ผลที่ไม่คาดคิด
ขั้นตอนที่ 1: เปิดไฟล์ .htaccess และเลือกตำแหน่งที่วาง
ไฟล์ .htaccess เป็นไฟล์ซ่อน ต้องเปิดตัวเลือกแสดงไฟล์ซ่อนใน File Manager ก่อน กฎ Redirect ทั้งหมดต้องวาง ไว้เหนือ บล็อก # BEGIN WordPress หรือกฎ Rewrite ของ CMS เพราะกฎของ CMS จะส่งทุกคำขอไปที่ index.php และจบการประมวลผลด้วย [L] ถ้าวางไว้ด้านล่าง Redirect จะไม่มีโอกาสทำงาน
บรรทัดแรกของส่วนที่เพิ่มต้องมี
RewriteEngine On
ขั้นตอนที่ 2: เลือกกฎตามกรณีใช้งาน
ย้ายหน้าเดียว
RewriteRule ^old-page/?$ https://example.com/new-page/ [R=301,L]
ใน .htaccess เส้นทางที่นำมาเทียบจะไม่มีเครื่องหมาย / นำหน้า จึงเขียน ^old-page ไม่ใช่ ^/old-page ส่วน /? ทำให้รองรับทั้งแบบมีและไม่มี / ปิดท้าย
ถ้าเขียนด้วย mod_alias จะได้แบบนี้ (ต้องมี / นำหน้า)
Redirect 301 /old-page/ https://example.com/new-page/
ข้อควรระวัง: Redirect จับคู่แบบคำนำหน้า (prefix) คำขอ /old-page/abc จะถูกส่งไปที่ /new-page/abc ด้วย
ย้ายทั้งโฟลเดอร์ โดยเก็บส่วนท้ายของ URL ไว้
RewriteRule ^blog/(.*)$ https://example.com/news/$1 [R=301,L]
(.*) เก็บทุกอย่างหลัง blog/ ไว้ แล้วนำไปใส่แทน $1 เช่น /blog/2024/hello/ จะไปที่ /news/2024/hello/
บังคับใช้ HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
บน Plesk มีตัวเลือกในหน้าจอให้ทำได้โดยไม่ต้องเขียนเอง ดู บังคับเว็บไซต์ให้ใช้ HTTPS บน Plesk
รวมโดเมนให้เหลือแบบเดียว (www เป็นไม่มี www)
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
ถ้าต้องการให้ไปที่ www ให้กลับเงื่อนไขเป็น ^example\.com$ และเปลี่ยนปลายทางเป็น https://www.example.com เลือกเพียงแบบเดียวและใช้ให้ตรงกับ Canonical URL ของเว็บ
ย้ายทั้งโดเมน
วางไว้ใน .htaccess ของโดเมนเดิม (โดเมนเดิมต้องยังชี้มาที่เซิร์ฟเวอร์นี้)
RewriteCond %{HTTP_HOST} ^(www\.)?old-example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
ควรคงโดเมนเดิมและ Redirect นี้ไว้อย่างน้อยหนึ่งปี และแจ้งการย้ายใน Google Search Console ด้วยเครื่องมือ Change of Address
URL เดิมที่มี Query String
RewriteRule มองไม่เห็นส่วนหลังเครื่องหมาย ? ต้องใช้ RewriteCond ตรวจ %{QUERY_STRING}
RewriteCond %{QUERY_STRING} (^|&)id=42(&|$)
RewriteRule ^product\.php$ https://example.com/products/widget/ [R=301,L,QSD]
แฟล็ก QSD (Apache 2.4 ขึ้นไป) ตัด Query String เดิมทิ้ง ถ้าไม่ใส่ ปลายทางจะกลายเป็น /products/widget/?id=42
ขั้นตอนที่ 3: ทดสอบด้วย 302 ก่อน แล้วค่อยเปลี่ยนเป็น 301
เบราว์เซอร์จำ 301 ไว้ในแคชนานมาก ถ้าเขียนผิดแล้วแก้ เบราว์เซอร์ที่เคยเปิดไปแล้วอาจยังไปที่ปลายทางผิดอยู่ ระหว่างทดสอบให้ใช้ R=302 เมื่อยืนยันว่าถูกต้องแล้วจึงเปลี่ยนเป็น R=301