ทำ 301 Redirect ใน .htaccess ทุกรูปแบบ

301 Redirect เป็น HTTP Response ที่บอกเบราว์เซอร์และ Search Engine ว่า URL เดิมได้ย้ายไปยัง URL ใหม่อย่างถาวร ใช้บ่อยในการย้ายเว็บ เปลี่ยน URL structure หรือบังคับ HTTPS บทความนี้รวม .htaccess Redirect Patterns ทุกรูปแบบที่ใช้บ่อย พร้อมคำอธิบายและตัวอย่างที่ทดสอบแล้ว

301 vs 302 Redirect ต่างกันอย่างไร

ก่อนเริ่ม ควรเข้าใจความแตกต่าง:

สำหรับ SEO ควรใช้ 301 เสมอ ยกเว้นกรณีที่ต้องการ redirect ชั่วคราวจริงๆ

โครงสร้างพื้นฐานของ .htaccess Redirect

ไฟล์ .htaccess ต้องเปิดใช้งาน mod_rewrite ก่อนด้วย:

Options +FollowSymLinks
RewriteEngine On

รูปแบบที่ 1 — Redirect URL เดี่ยว

ใช้เมื่อต้องการ redirect หน้าเดี่ยวหรือ URL เดียว:

Redirect 301 /old-page.html https://yourdomain.com/new-page.html

หรือใช้ RewriteRule:

RewriteRule ^old-page\.html$ /new-page.html [R=301,L]

รูปแบบที่ 2 — Redirect HTTP to HTTPS (บังคับ)

สำคัญมากสำหรับ SEO และ Security — บังคับให้ทุก Request ใช้ HTTPS:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

รูปแบบที่ 3 — Redirect www ไปยัง non-www

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.yourdomain\.com [NC]
RewriteRule ^(.*)$ https://yourdomain.com/$1 [R=301,L]

รูปแบบที่ 4 — Redirect non-www ไปยัง www

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

รูปแบบที่ 5 — Redirect ทั้ง Folder

ย้ายทุก URL ใน /old-folder/ ไปยัง /new-folder/ พร้อม path:

RewriteRule ^old-folder/(.*)$ /new-folder/$1 [R=301,L]

รูปแบบที่ 6 — Redirect Domain เดิมไปยัง Domain ใหม่

ใช้เมื่อย้ายเว็บไปยัง Domain ใหม่ทั้งหมด:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?olddomain\.com [NC]
RewriteRule ^(.*)$ https://newdomain.com/$1 [R=301,L]

รูปแบบที่ 7 — Redirect URL ที่มี Query String

เมื่อต้องการ redirect URL ที่มี parameter:

RewriteCond %{QUERY_STRING} ^id=123$
RewriteRule ^product\.php$ /new-product-page.html? [R=301,L]

เครื่องหมาย ? ท้าย URL ปลายทางป้องกันการส่ง query string เดิมต่อไป

รูปแบบที่ 8 — HTTP to HTTPS + www to non-www (รวมกัน)

บังคับทั้ง HTTPS และ non-www ในคราวเดียว:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.yourdomain\.com [NC]
RewriteRule ^(.*)$ https://yourdomain.com/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

รวมรูปแบบ .htaccess Redirect เพิ่มเติม

นอกจาก 8 รูปแบบหลักด้านบนแล้ว ในงานจริงยังมีกรณีที่พบบ่อยอีกหลายแบบ ตัวอย่างต่อไปนี้รวบรวม Redirect Pattern ที่ใช้บ่อยที่สุดเมื่อต้องจัดระเบียบ URL ของเว็บไซต์ ทั้งบังคับ trailing slash, ย้ายหน้าเดิมไปหน้าใหม่ และ redirect ทั้งโดเมนพร้อมกัน เพื่อให้นำไปใช้ได้ทันทีโดยแก้เพียงชื่อโดเมนและ path ของคุณเอง

บังคับ HTTPS + non-www ในชุดเดียว (Canonical Host)

ถ้าต้องการให้ทุก Request ลงท้ายที่ https://yourdomain.com เพียงเวอร์ชันเดียวเสมอ ไม่ว่าจะเข้ามาทาง http หรือ www ให้รวมเงื่อนไขทั้งหมดไว้ในกฎเดียว:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://yourdomain.com/$1 [R=301,L]

เครื่องหมาย [OR] ทำให้กฎทำงานเมื่อ "ไม่ใช่ HTTPS" หรือ "มี www" อย่างใดอย่างหนึ่ง ทำให้ทั้ง 4 ทางเข้า (http/https × www/non-www) ถูกรวมไปยัง Canonical URL เดียวด้วย redirect ครั้งเดียว ลดความเสี่ยง Redirect Chain

บังคับ Trailing Slash (เพิ่ม/ลบ / ท้าย URL)

เพื่อความสม่ำเสมอของ URL ควรเลือกว่าจะให้ URL ลงท้ายด้วย / หรือไม่ แล้วบังคับให้เป็นแบบเดียวกันทั้งเว็บ เพิ่ม slash ท้าย directory:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]

หรือในทางกลับกัน ลบ slash ท้ายออกเพื่อให้ URL สั้นลง:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]

เลือกใช้แบบใดแบบหนึ่งเท่านั้น อย่าใส่ทั้งสองกฎพร้อมกันเพราะจะตีกันจนเกิด Redirect Loop

ย้ายหน้าเดิมไปหน้าใหม่ (Old Page to New Page)

เมื่อเปลี่ยนชื่อบทความหรือ restructure URL ของหน้าเดียว ให้ map แบบ 1 ต่อ 1 เพื่อไม่ให้สูญเสียอันดับของหน้าเดิม:

Redirect 301 /blog/old-article /blog/new-article-slug
Redirect 301 /promo-2026.html /promotions.html

ถ้ามีหลายหน้าที่ต้องย้าย แนะนำใช้ RedirectMatch หรือไล่เขียน Redirect 301 ทีละบรรทัด เพื่อให้แต่ละหน้าชี้ตรงไปยังปลายทางสุดท้าย ไม่ผ่านหน้ากลาง

301 vs 302 vs 307 ต่างกันอย่างไร

HTTP มี Redirect status code หลายตัว ที่ใช้บ่อยคือ 301, 302 และ 307 แต่ละตัวบอก Browser และ Search Engine ต่างกัน การเลือกผิดอาจทำให้ SEO เสียหายหรือ POST request ทำงานผิดพลาดได้ ก่อนเขียนกฎ redirect ทุกครั้งจึงควรถามตัวเองก่อนว่า การย้ายนี้เป็นแบบถาวรหรือชั่วคราว และต้องคง HTTP method เดิมไว้หรือไม่ คำตอบจะชี้ว่าควรเลือก status code ตัวใด ตารางต่อไปนี้สรุปความแตกต่างให้เปรียบเทียบได้ง่าย:

Status ความหมาย ถ่าย Link Equity ใช้เมื่อ
301 Moved Permanently — ย้ายถาวร ใช่ (~90-99%) ย้ายเว็บ, บังคับ HTTPS, www/non-www, เปลี่ยน URL
302 Found — ย้ายชั่วคราว ไม่ หน้า maintenance, A/B testing, โปรโมชันชั่วคราว
307 Temporary Redirect — ชั่วคราว คง method เดิม ไม่ redirect ที่ต้องคง POST/method เดิม (เช่น API, form)

ข้อแตกต่างสำคัญของ 307 คือ Browser จะคง HTTP method เดิมไว้ (เช่น POST ยังเป็น POST) ขณะที่ 302 ในทางปฏิบัติ Browser หลายตัวเปลี่ยน POST เป็น GET ดังนั้นถ้า redirect หน้าที่รับข้อมูลแบบ form ควรพิจารณา 307 แต่สำหรับงาน SEO ทั่วไปบนเว็บไซต์เนื้อหา ให้ใช้ 301 เป็นหลัก

301 Redirect กับ SEO

301 Redirect เป็นเครื่องมือสำคัญในการรักษาอันดับเมื่อต้องเปลี่ยนโครงสร้าง URL หากทำถูกต้อง คุณจะไม่เสียอันดับที่สะสมมา แต่ถ้าทำผิดอาจทำให้ traffic จาก Google หายไปทั้งหมด หลายเว็บที่ย้ายโดเมนหรือเปลี่ยนระบบ CMS โดยไม่ได้วางแผน redirect ให้ดี มักพบว่าอันดับตกลงอย่างรวดเร็วในไม่กี่สัปดาห์ เพราะ Google ตีความว่าหน้าเดิมหายไปและเริ่มนับหน้าใหม่จากศูนย์ ประเด็น SEO ที่ต้องเข้าใจมีดังนี้:

หลังย้าย URL ควรอัปเดต Sitemap, แก้ Internal Link ให้ชี้ URL ใหม่โดยตรง และส่ง URL ใหม่เข้า Google Search Console เพื่อเร่งการ re-index ส่วน 301 ทำหน้าที่รองรับลิงก์เก่าจากภายนอกที่เราแก้ไม่ได้

ปัญหาที่พบบ่อยและวิธีแก้

เมื่อแก้ .htaccess แล้ว redirect ไม่ทำงานตามที่คาด มักมีสาเหตุซ้ำ ๆ ไม่กี่อย่าง ตรวจตามรายการนี้ก่อนเสมอ:

ทดสอบเสมอด้วยคำสั่ง curl -I http://yourdomain.com/old-page.html แล้วดูว่ามี HTTP/1.1 301 และ header Location: ชี้ไปยัง URL ที่ถูกต้องหรือไม่

ข้อควรระวัง: ก่อนบันทึก .htaccess ทุกครั้ง ให้ Backup ไฟล์เดิมก่อน และทดสอบด้วย Browser ในโหมด Incognito เพื่อหลีกเลี่ยง Cache ถ้าเกิด Redirect Loop ให้ลบ Browser Cache และตรวจสอบ Rule ที่ขัดกันเอง

คำถามที่พบบ่อย (FAQ)

301 กับ 302 ใช้ต่างกันอย่างไรในเรื่อง SEO

301 คือการย้ายถาวร Search Engine จะถ่าย Link Equity ไปยัง URL ใหม่และอัปเดต index ส่วน 302 คือชั่วคราว Search Engine ยังเก็บ URL เดิมไว้และไม่ถ่าย Link Equity สำหรับการย้ายเว็บ เปลี่ยน URL หรือบังคับ HTTPS ควรใช้ 301 เสมอ ใช้ 302 เฉพาะกรณีย้ายชั่วคราวจริง ๆ เช่น หน้า maintenance หรือ A/B testing

แก้ .htaccess แล้วเกิด Redirect Loop ต้องทำอย่างไร

Redirect Loop มักเกิดจากปลายทางของ rule ยัง match กับเงื่อนไขเดิมอีกครั้ง ให้เพิ่ม RewriteCond เพื่อยกเว้นปลายทางออกจากการ match เช่น ตรวจ %{HTTPS} หรือ %{HTTP_HOST} ก่อน rewrite และล้าง Browser Cache เพราะ 301 ที่ถูก cache ไว้จะ redirect ต่อแม้แก้ไฟล์แล้ว ทดสอบในโหมด Incognito ทุกครั้ง

301 redirect ส่งผลต่ออันดับ SEO หรือไม่

301 ช่วยรักษาอันดับ SEO เพราะถ่าย Link Equity ส่วนใหญ่ (ราว 90-99%) จาก URL เดิมไปยัง URL ใหม่ และยังป้องกัน Duplicate Content เมื่อบังคับ HTTPS หรือเลือก www/non-www เพียงเวอร์ชันเดียว แต่ควรหลีกเลี่ยง Redirect Chain (A→B→C) เพราะเพิ่ม latency และลดทอน Link Equity ให้ redirect ตรงไปยังปลายทางสุดท้ายเสมอ

ลำดับของ RewriteRule ใน .htaccess สำคัญไหม

สำคัญมาก Apache ประมวลผล rule จากบนลงล่าง rule ที่ครอบคลุมกว้าง (เช่น บังคับ HTTPS ทั้งเว็บ) ควรอยู่บนสุด ส่วน rule เฉพาะ URL ควรอยู่ก่อนแต่ใช้ flag [L] เพื่อหยุด chain หลัง match การวางผิดลำดับอาจทำให้บาง redirect ไม่ทำงานหรือเกิด loop ได้

Hosting ที่รองรับ .htaccess เต็มรูปแบบ

AsiaGB Hosting รองรับ mod_rewrite และ .htaccess เต็มรูปแบบบน Apache เริ่มต้น 500 บาท/ปี พร้อม DirectAdmin

ดูแพ็กเกจ Hosting