ไฟล์ .htaccess คือหัวใจของการควบคุม URL บน Web Hosting ที่ใช้ Apache ซึ่งเป็น Shared Hosting ส่วนใหญ่ในไทย ไม่ว่าจะเป็นการเปลี่ยนเส้นทาง URL เก่าไปยัง URL ใหม่, บังคับให้ผู้เข้าชมใช้ HTTPS หรือจัดการ www กับ non-www บทความนี้รวบรวมทุก Redirect รูปแบบที่ใช้งานบ่อยพร้อมตัวอย่าง Code ที่นำไปใช้ได้ทันที
Redirect คืออะไร และทำไมต้องใช้ .htaccess
Redirect คือการส่งต่อผู้เข้าชม (และ Search Engine Bot) จาก URL หนึ่งไปยังอีก URL หนึ่งโดยอัตโนมัติ ซึ่งมีประโยชน์ในหลายกรณี เช่น เปลี่ยนโครงสร้าง URL ของเว็บไซต์, ย้ายเว็บไปยัง Domain ใหม่, หรือรวม URL ซ้ำซ้อนให้เหลือเส้นทางเดียว
บน Shared Hosting ที่ใช้ cPanel ไฟล์ .htaccess จะอยู่ใน public_html/ ของ Domain หลัก หรือใน Subdirectory ของ Addon Domain สามารถแก้ไขได้ผ่าน File Manager ใน cPanel โดยตรง โดยไม่ต้องเข้าถึง Server ด้วย SSH
ประเภทของ Redirect ที่ควรรู้
- 301 Moved Permanently - บอก Search Engine ว่า URL ย้ายถาวร ส่ง Link Equity (SEO Value) ไปด้วย เหมาะกับการ Redirect ถาวร
- 302 Found (Temporary) - บอกว่าการ Redirect ชั่วคราว Search Engine จะยังจำ URL เดิมไว้ เหมาะกับการทดสอบหรือ Maintenance
- 307 Temporary Redirect - เหมือน 302 แต่รับประกันว่า HTTP Method (POST/GET) จะไม่เปลี่ยน
สำหรับงานส่วนใหญ่บน Shared Hosting ให้ใช้ 301 เมื่อต้องการ Redirect ถาวร และ 302 เมื่อต้องการชั่วคราวเท่านั้น
วิธีเปิดและแก้ไข .htaccess ใน cPanel
- Login เข้า cPanel ของ Hosting
- ไปที่ Files > File Manager
- เปิดโฟลเดอร์
public_html(หรือ Addon Domain directory) - ถ้าไม่เห็น .htaccess ให้คลิก Settings แล้วเลือก "Show Hidden Files (dotfiles)"
- คลิกขวาที่ .htaccess แล้วเลือก Edit
- เพิ่ม Code Redirect แล้วคลิก Save Changes
.htaccess (มีจุดนำหน้า) ไม่มีนามสกุลRedirect พื้นฐาน: URL เดียวไปยัง URL ใหม่
การ Redirect URL เดี่ยวเป็นสิ่งที่พบบ่อยที่สุด เช่น เมื่อเปลี่ยนชื่อหน้า หรือลบหน้าแล้วอยากส่งต่อไปหน้าที่เกี่ยวข้อง
# Redirect หน้าเดียว (301 Permanent)
Redirect 301 /old-page.html https://yoursite.com/new-page.html
# Redirect หน้าเดียว (302 Temporary)
Redirect 302 /promo.html https://yoursite.com/promotion.html
# Redirect โฟลเดอร์ทั้งหมดไปยัง URL ใหม่
Redirect 301 /old-folder/ https://yoursite.com/new-folder/
Redirect directive แบบง่ายเมื่อต้องการ Redirect เพียงไม่กี่ URL ไม่ต้องเปิด mod_rewrite ให้ซับซ้อนบังคับ HTTPS ด้วย .htaccess (สำคัญมาก)
เว็บไซต์ที่ยังไม่บังคับ HTTPS จะมี URL แบบ http:// ที่ Google มองว่าไม่ปลอดภัย และ Browser จะแสดงคำเตือน "Not Secure" ควรตั้งค่าให้ redirect ทุก HTTP ไปเป็น HTTPS เสมอ
# บังคับ HTTPS ทุก request
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
วางโค้ดนี้ไว้ส่วนบนสุดของ .htaccess ก่อน Rule อื่น ๆ ทั้งหมด เพื่อให้ทำงานก่อนเสมอ
จัดการ www กับ non-www
Google มองว่า www.yoursite.com กับ yoursite.com เป็นคนละเว็บ ต้องเลือกข้างใดข้างหนึ่งและ Redirect อีกฝั่งมาเสมอ มิฉะนั้น Content ซ้ำซ้อน (Duplicate Content) จะทำให้ SEO แย่ลง
# บังคับ non-www (แนะนำ)
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
# ------ หรือ ------
# บังคับ www
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
เปลี่ยน Domain ใหม่ทั้งหมด (Domain Migration)
เมื่อย้ายเว็บจาก Domain เก่าไปยัง Domain ใหม่ ต้องแน่ใจว่าทุก URL เก่ายังคง Redirect ไปยัง URL ใหม่ที่ตรงกัน เพื่อรักษา SEO Ranking ไว้
# ย้าย Domain เก่าไปยัง Domain ใหม่ทั้งหมด
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?old-domain\.com$ [NC]
RewriteRule ^(.*)$ https://new-domain.com/$1 [R=301,L]
วาง Code นี้ใน .htaccess ของ Domain เก่า และตรวจสอบให้แน่ใจว่า Hosting ยังรองรับ Domain เก่าอยู่ (ยัง Resolve มาที่ Server เดิม) ก่อนที่ DNS จะเปลี่ยน
Redirect ไปยังหน้า Maintenance
เมื่อต้องปิดปรับปรุงเว็บชั่วคราว ควรใช้ 302 (ไม่ใช่ 301) เพื่อให้ Search Engine ไม่ลบ URL เดิมออกจาก Index
# Redirect ทุกหน้าไปยัง Maintenance page
# ยกเว้นหน้า maintenance.html เอง
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/maintenance\.html$
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.000$
RewriteRule ^(.*)$ /maintenance.html [R=302,L]
123.456.789.000 ด้วย IP จริงของคุณ เพื่อให้คุณเข้าถึงเว็บได้ปกติระหว่าง MaintenanceRedirect แบบ Pattern Matching
เมื่อต้องการ Redirect URL จำนวนมากที่มีรูปแบบเหมือนกัน เช่น เปลี่ยน URL จาก ?id=123 เป็นแบบ Slug สามารถใช้ RewriteRule กับ Regular Expression ได้
# เปลี่ยน URL จาก query string เป็น slug
# เช่น /article.php?id=42 → /article-42/
RewriteEngine On
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^article\.php$ /article-%1/? [R=301,L]
# Redirect URL ที่มี .php extension ไปเป็นแบบไม่มี extension
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)\.php$ /$1 [R=301,L]
ลำดับของ Rule ใน .htaccess ที่ถูกต้อง
ลำดับของ Redirect Rule สำคัญมาก ควรจัดเรียงดังนี้เพื่อหลีกเลี่ยงปัญหา:
- เปิด
RewriteEngine Onก่อน - บังคับ HTTPS
- จัดการ www/non-www
- Redirect เฉพาะ URL (Specific Redirect)
- Pattern Matching Rules
- Rule อื่น ๆ เช่น Error Page, Cache Control
สำหรับผู้ที่กำลังมองหา Hosting คุณภาพที่รองรับ .htaccess และ mod_rewrite ได้ดี ลองดูที่ asiagb.com ผู้ให้บริการ Web Hosting และ VPS สัญชาติไทย ใช้ DirectAdmin มี Apache เต็มรูปแบบ SLA 99%
ตรวจสอบว่า Redirect ทำงานถูกต้อง
# ทดสอบ Redirect ด้วย curl (ดู HTTP Status Code)
curl -I https://yoursite.com/old-page.html
# ทดสอบการบังคับ HTTPS
curl -I http://yoursite.com/
# ทดสอบ www → non-www redirect
curl -I http://www.yoursite.com/
# ดู Redirect Chain ทั้งหมด (หลายขั้น)
curl -IL https://yoursite.com/old-page.html
# ทดสอบ Status Code สั้น ๆ
curl -o /dev/null -sw "%{http_code}" https://yoursite.com/old-page.html
แก้ปัญหาที่พบบ่อย
Error: "Too many redirects" หรือ ERR_TOO_MANY_REDIRECTS
เกิดจาก Redirect Loop คือ URL A ส่งไปหา URL B แล้ว URL B ส่งกลับมาหา URL A วนซ้ำ สาเหตุหลักคือใส่ทั้ง www Rule และ non-www Rule พร้อมกัน หรือบังคับ HTTPS แต่ Hosting ไม่ได้ใช้ Port 443 ตรง ๆ (ผ่าน Load Balancer)
# แก้ปัญหา HTTPS redirect loop เมื่อ Hosting อยู่หลัง Load Balancer
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Error: "500 Internal Server Error" หลังแก้ .htaccess
มักเกิดจาก Syntax ผิดใน .htaccess หรือใช้ Directive ที่ Server ไม่รองรับ วิธีแก้คือตรวจดู Apache Error Log ใน cPanel (ไปที่ Metrics > Errors) หรือลองคอมเมนต์บรรทัดที่เพิ่งเพิ่มด้วยเครื่องหมาย # แล้ว Reload ดู
# ตรวจสอบว่า mod_rewrite เปิดอยู่
# เพิ่มบรรทัดนี้แล้วลอง access เว็บ (ถ้า 500 แสดงว่า mod_rewrite ไม่ได้เปิด)
Options +FollowSymLinks
RewriteEngine On
Error: Redirect ไม่ทำงาน ยังเห็น URL เดิม
สาเหตุที่พบบ่อยคือ Browser Cache ให้ลอง Hard Refresh (Ctrl+Shift+R หรือ Cmd+Shift+R) หรือเปิดใน Private/Incognito Mode ก่อน นอกจากนี้ตรวจสอบว่าไฟล์ .htaccess อยู่ในโฟลเดอร์ที่ถูกต้อง (ต้องอยู่ใน Root ของ Domain ไม่ใช่ Subfolder)
Error: Redirect ทำงานกับบางหน้าเท่านั้น ไม่ครอบคลุมทุก URL
ถ้าใช้ Redirect 301 /old/ /new/ มันจะ Match เฉพาะ URL ที่ขึ้นต้นด้วย /old/ เท่านั้น ถ้าอยากครอบคลุมทุก URL ต้องใช้ RewriteRule กับ Pattern ^(.*)$ แทน
# Redirect ทุก URL ภายใต้โฟลเดอร์เก่า
RewriteEngine On
RewriteRule ^old-section/(.*)$ /new-section/$1 [R=301,L]
Error: .htaccess ที่บันทึกแล้วหายไปหรือไม่มีผล
Hosting บางเจ้ามี Cache ระดับ Server หรือ Varnish/LiteSpeed Cache ที่อาจ Serve เนื้อหาเก่าอยู่ ให้ล้าง Cache จาก cPanel (LiteSpeed Cache > Flush All) หรือติดต่อ Support ให้ล้าง Server Cache
คำถามที่พบบ่อย
Q: ควรใช้ 301 หรือ 302 สำหรับการเปลี่ยน Domain ถาวร?
A: ใช้ 301 Permanently เสมอเมื่อเปลี่ยน Domain ถาวร เพราะ 301 จะส่ง Link Equity และ Ranking สัญญาณ SEO ทั้งหมดไปยัง Domain ใหม่ ทำให้ Google เปลี่ยน Index จาก Domain เก่าไปยัง Domain ใหม่ได้เร็วขึ้น ถ้าใช้ 302 Google จะยังคง Index Domain เก่าต่อไปเรื่อย ๆ
Q: Redirect จาก HTTP ไป HTTPS จะทำให้เว็บช้าลงไหม?
A: มีผลเล็กน้อยในการโหลดครั้งแรก (เพิ่ม 1 Round Trip) แต่ Browser สมัยใหม่รองรับ HSTS (HTTP Strict Transport Security) ที่จะ Redirect ฝั่ง Browser เองโดยไม่ต้องไปถาม Server ทำให้หลังจากครั้งแรกแทบไม่มีผล สามารถเพิ่ม HSTS ใน .htaccess ได้ด้วย Header: Header always set Strict-Transport-Security "max-age=31536000"
Q: ถ้า cPanel มี Redirects Tool อยู่แล้ว ต้องแก้ .htaccess เองไหม?
A: cPanel มี Redirects Tool (ใน Domains Section) ที่ใช้สร้าง Redirect ง่าย ๆ ได้โดยไม่ต้องแก้ไขไฟล์เอง เหมาะสำหรับ Redirect URL เดี่ยว แต่ถ้าต้องการ Rule ซับซ้อน เช่น Pattern Matching หรือบังคับ HTTPS/www ยังต้องแก้ .htaccess โดยตรง เนื่องจาก Tool ของ cPanel มีความสามารถจำกัด