คำตอบสั้น ๆ: เลือกรูปแบบโดเมนหลักแล้วบังคับให้ทุกทางเข้าไปที่เดียว ด้วย 301 ที่ถูกต้อง ไม่ให้เกิดเนื้อหาซ้ำและไม่ให้เกิดการวนซ้ำ
คู่มือนี้อธิบาย Redirect ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
เว็บเดียวกันที่เข้าได้ทั้ง example.com และ www.example.com ถือเป็นสองเว็บในสายตาของเครื่องมือค้นหา ทำให้คะแนนความน่าเชื่อถือถูกแบ่งครึ่ง และเมื่อรวมกับ HTTP และ HTTPS จะกลายเป็นสี่เวอร์ชัน
คู่มือนี้บังคับให้ทุกทางเข้าไปจบที่ URL เดียว ด้วยการเปลี่ยนเส้นทางเพียงครั้งเดียว ซึ่งเป็นจุดที่หลายเว็บทำได้ไม่ดีเพราะเปลี่ยนเส้นทางหลายทอด
สิ่งที่ต้องเตรียม (Redirect)
- สิทธิ์แก้ไขคอนฟิกเว็บเซิร์ฟเวอร์หรือแผงควบคุม
- ใบรับรอง SSL ที่ครอบคลุมทั้งสองรูปแบบ
ขั้นตอนที่ 1: เลือกรูปแบบหลัก
ทั้งสองแบบใช้ได้เท่ากันในแง่ SEO สิ่งสำคัญคือเลือกแล้วใช้อย่างสม่ำเสมอ
- ไม่มี www สั้นกว่า จำง่ายกว่า เป็นที่นิยมในเว็บสมัยใหม่
- มี www มีข้อได้เปรียบทางเทคนิคคือตั้ง CNAME ได้ ซึ่งจำเป็นเมื่อใช้ CDN บางเจ้า และแยกคุกกี้ออกจากโดเมนหลักได้
หากเว็บเปิดมานานแล้ว ให้เลือกแบบที่ Google เก็บดัชนีไว้มากกว่าเพื่อลดผลกระทบ
# ดูว่าแบบไหนถูกเก็บดัชนีมากกว่า ค้นหาใน Google
site:example.com
site:www.example.com
ขั้นตอนที่ 2: ตั้ง DNS ให้ทั้งสองชี้มาที่เดียวกัน
example.com. IN A 203.0.113.10
www.example.com. IN CNAME example.com.
หรือใช้ A Record ทั้งคู่ก็ได้ ทั้งสองแบบทำงานเหมือนกัน
dig +short example.com
dig +short www.example.com
ขั้นตอนที่ 3: ขอใบรับรองให้ครอบคลุมทั้งสอง
sudo certbot --nginx -d example.com -d www.example.com --agree-tos -m [email protected]
หากใบรับรองไม่ครอบคลุมชื่อที่ผู้ใช้พิมพ์ เบราว์เซอร์จะแสดงคำเตือนก่อนที่การเปลี่ยนเส้นทางจะทำงาน ซึ่งทำให้ผู้ใช้จำนวนมากปิดหน้าไปเลย
echo | openssl s_client -connect example.com:443 -servername www.example.com 2>/dev/null \
| openssl x509 -noout -text | grep -A1 'Subject Alternative Name'
ขั้นตอนที่ 4: ตั้ง Redirect บน Nginx
วิธีที่ถูกต้องคือแยก server block สำหรับชื่อที่ต้องการเปลี่ยนเส้นทาง ไม่ใช่ใช้ if ภายใน block เดียว
# HTTP ทั้งสองชื่อ ไปที่ HTTPS ของชื่อหลักโดยตรง ครั้งเดียวจบ
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
# HTTPS ของ www ไปที่ HTTPS ของชื่อหลัก
server {
listen 443 ssl;
http2 on;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
return 301 https://example.com$request_uri;
}
# เว็บจริง
server {
listen 443 ssl;
http2 on;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/example.com;
# ...
}
sudo nginx -t && sudo systemctl reload nginx
จุดสำคัญคือ block แรกส่ง HTTP ไปยัง HTTPS ของชื่อหลักโดยตรง ไม่ใช่ไป HTTPS ของ www ก่อนแล้วค่อยไปชื่อหลัก ซึ่งจะกลายเป็นสองทอด