Mod Rewrite (mod_rewrite) ด้วย Apache สร้าง URL Friendly รองรับ SEO ด้วย (.htaccess)
Mod Rewrite สร้าง URL Friendly รองรับ SEO ด้วย Module mod_rewrite
ในยุคแห่งการแข่งขัน SEO เพื่อให้ได้อันดับการค้นหาของ Search Engine อย่าง Google ที่จะทำให้เว็บไซต์ติดอันดับการค้นหาอย่างรวดเร็ว และอันดับต้น ๆ ซึ่งผลการค้นหาเหล่านี้ทาง Google ไม่ได้อาศัยคนหรือเจ้าหน้าที่มาทำการจัดอันดับแต่อย่างใด แต่เป็นไปตามอัลกิริทึมของ Google ที่ถูกเขียน Logic ไว้อันซับซ้อนประกอบด้านตัวแปรมากกว่า 2 ล้านตัวแปร และปัจจัยอื่น ๆ ที่เป็นความลับของ Google ที่จะมีหลักการวิเคราะห์ให้คะแนน และจัดอันดับอัตโนมัติ และแม้กระทั่ง Search Engine เจ้าอื่น ๆ ก็ใช้เทคนิคในรูปแบบเช่นเดียวกัน และบทความนี้จะให้ความสำคัญกับ Search Engine ของ Google เป็น Seach Engine อันดับหนึ่งของโลก และมีผู้ใช้มากที่สุด เกือบ 98% (สถิติในประเทศ)
วิธีการที่ Search Engine เหล่านี้เข้ามาจัดการกับเง็บไซต์ของเรานั้น เว็บไซต์เหล่านี้จะต้องทำการสำเนาข้อมูลในหน้านั้น ๆ เข้าไปในระบบฐานข้อมูลของตัวเอง โดยการส่ง bot (Google bot) มาเก็บข้อมูลตามเว็บไซต์ต่าง ๆ ใช้วิธีไต่มาตามลิ้งค์ และทำสำเนาข้อมูล พร้อมกับการให้คะแนน ข้อมูลเนื้อหาเหล่านั้นด้วย เพื่อพร้อมจะแสดงผลในการค้นหาจากผู้ใช้ และเวลาที่ bot เหล่านี้มาเก็บข้อมูล จะใช้วิธีการไต่และอ่านไปตาม URL หลายเว็บได้ออกแบบ URL แบบเป็นแบบ Dynamic URL
เช่น
www.thaicreate.com/view_detail.php?id=123
วิธีนี้ ไม่่ได้ช่วยบ่งบอกว่า URL นี้เกี่ยวข้องกับอะไร การได้คะแนนของ SEO ก็น้อยลงตามไปด้วย
แต่ถ้าเราใช้ URL
เช่น
www.thaicreate.com/ajax/ajax-tutorial-basic/ www.thaicreate.com/ajax/ajax-tutorial-basic.html
เมื่อ bot เข้ามาเก็บข้อมูลก็จะทราบได้ทันทีแปลความหมายได้เลยว่า URL นี้เป็นเนื้อหาเกี่ยวกับบทความ Ajax และการสอน Ajax แบบ Basic ซึ่งจะได้คะแนน SEO ที่มากขึ้น รวมทั้งอันดับการค้นหาก็จะดีขึ้นไปด้วย และวิธีนี้ทาง Google ก็ได้แนะนำหลักการปฏิบัติแบบนี้เช่นเดียวกัน เทคนิคนี้ถูกใช้แพร่หลายไปยังเว็บไซต์ต่าง ๆ เป็นเทคนิคการเพิ่ม Keyword เข้าไปใน URL ที่ได้รับความนิยมอย่างมาก เพราะได้ผลมีผลดีทั้งในรูปแบบของ SEO และผู้ใช้ก็เข้าใจวัตถุประสงค์ของ URL เช่นเดียวกัน
เพิ่มเติม
การทำ URL Friendly เพื่อรองรับ SEO นั้น เป็นแค่องค์ประกอบหนึ่งที่จะช่วยให้อันดับการค้นหาดีขึ้นเท่านั้น และยังมีองค์ประกอบอีกมากมาย และบางครั้งการทำ SEO ด้วย URL มากจนเกินไปก็มีผลเสียต่อเว็บไซต์มากเช่นเดียวกัน สำหรับพื้นฐานการทำ SEO สามารถอ่านคำแนะนำได้จากบทความนี้
การทำ SEO กับแนวทางการเขียนโปรแกรมในยุคการแข่งขัน SEO (Search Engine)
http://www.thaicreate.com/community/seo-programming.html
การทำ URL SEO Friendly จะต้องทำอย่างไร?
ถ้าคุณสร้างเว็บไซต์ด้วย HTML ซึ่งเป็น Static Content ก็ไม่ใช่เรื่องยากอะไรที่จะทำแบบนั้น ก็เพียงสร้างโฟเดอร์ตามโครงสร้างและสร้างชื่อไฟล์ให้อยู่ในรูปแบบที่ต้องการ ก็เป็นการเสร็จสิ้น แต่ในความเป็นจริงเว็บไซต์ส่วนมากจะเป็นแบบ Dynamic หรือมีการเพิ่มลบข้อมูลตลอดเวลา เช่น การเพิ่มข้อมูลใน MySQL ด้วย PHP การเพิ่ม ตอนที่แสดงผลก็จะมีการอ้างอิง ID ข้องข้อมูลขั้น ๆ และ PHP ก็เอา ID เพื่อไปเลือกข้อมูลจาก MySQL มาแสดงอีกที เช่น
http://localhost/viewdetail.php?ID=1234
ซึ่งวิธีด้วยิวธีนี้เองเราจะทำการแปลง URL เหล่านี้ให้อยู่ในรูปแบบของ SEO Friendly เช่น
http://localhost/1234/
แต่ในหลักการ SEO ที่ถูกต้องจริง ๆ แล้ว URL เหล่านี้ควรจะเป็น Keyword ของบทความ
ซึ่งใน MySQL ที่จัดเก็บควรจะเพิ่ม Column ที่เป็น Keyword เข้าไปด้วย และแทนการใช้ ID ซึ่งจะได้เป็นแค่ตัวเลขโดยไม่ได้สื่อถึงวัถตุประสงค์แต่อย่างใด เช่น
http://localhost/viewdetail.php?ID=1234&Keyword=ajax-tutorial
ได้ URL ใหม่เป็น
http://localhost/1234/ajax-tutorial/
URL ใหม่ที่สวยงามน่าคลิก และเหมาะสมต่อ SEO อย่างยิ่ง
เริ่มต้นการทำ Mod Rewrite กับ Apache mod_rewrite Module
Mod Rewrite จะใช้บน Apache ทำงานอยู่บนไฟล์ .htaccess (ไฟล์นี้จะไว้สำหรับเขียนพวก Rewrite Rule ต่าง ๆ ลงในเว็บไซต์ และจะต้องจัดเก็บไว้ใน Root ของ เว็บ หรือถ้าอยู่ใน Sub Folder ก็จะต้องเก็บไว้ใน Sub นั้นด้วย) ฉะนั้นใน Apache Web Server นั้นจะถูกใช้ร่วมกับ PHP บทความนี้ก็จะทดสอบกับ PHP เช่นเดียวกัน และในขั้นแรกเราจะต้องตรวจสอบว่า Apache Web Server นั้นรองรับ mod_rewrite หรือไม่ ด้วยการใช้ phpinfo);
เพิ่มเติม
เนื่องจาก mod_rewrite นั้นจะทำงานในรูปแบบอ้างจาก root เพราะฉะนั้นในบทความนี้จะสร้าง root เว็บขึ้นมาใหม่ เพื่อความไม่สับสนเมื่อรันใน Sub Folder โดยจะใช้ URL ว่า
http://localhost:8081/
ซึ่งเปรียบเสมือนเว็บไซต์หนึ่ง ๆ เมื่อนำไปใช้งานจริง
สำหรับการสร้าง Port ใหม่ใน Apache บน localhost สามารถอ่านได้จากบทความนี้
Apache httpd Create New VirtualHost (Create New Port)
http://www.thaicreate.com/community/apache-httpd-create-new-virtualhost-create-new-port.html
โดยสร้างเป็น Port ที่ 8081 และ Root Document อยู่ที่ C:/Appserv/www/modrewrite/
httpd.conf
Listen 8081 <VirtualHost localhost:8081> DocumentRoot C:/Appserv/www/modrewrite/ </VirtualHost>
ทดสอบการทำงานของ Port ใหม่
ในรูปยังไม่มีไฟล์อะไรเป็นโฟเดอร์ว่างเปล่า
ย้ำเดียวจะงง ว่าการสร้าง Port ใหม่นี้เพื่อทดสอบเท่านั้น กรณีที่ไปใช้งานจริงไม่ต้องสร้างแต่อย่างใด หรือว่าจะใช้ผ่าน http://localhost/ เลยก็ได้ แต่ Path จะต้องเก็บไว้ที่ C:/Appserv/www/
ขั้นที่ 1 ตรวจสอบว่า Apache Web Server สามารถใช้ mod_rewrite ได้หรือไม่ ด้วยกาใช้ phpinfo();
phpinfo.php
<? phpinfo(); ?>
จัดเก็บไว้ที่ C:\Appserv\www\modrewrite\phpinfo.php จากนั้นทดสอบดูรายละเอียดของ phpinf() ได้จาก
http://localhost:8081/phpinfo.php
ดูในส่วนของ apache2handler และ Loaded Modules ว่ามี mod_rewrite อยู่หรือไม่ จากในตัวอย่างกฏว่าไม่มี ซึ่งวิธีแก้ไขจะต้องไปเปิดในไฟล์ httpd.conf (กรณีบน Host จริงให้แจ้งไปยังผู้ให้บริการ)
httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
ให้เพิ่มแถว ๆ ที่เป็น LoadModule ลองใช้การค้นหา ซึ่งในตัวที่เป็น Default จะมีการเปิดปิดไว้หลายตัว ดังรูป การเปิดคือการเอาเครื่องหมาย # ออก หลังจากนั้นก็ Restart Apache ซะ 1 รอบ
การแก้ไขและเปิด mod_rewirte ด้วยการเพิ่ม mod_rewrite.so บน apache
จากนั้นก็ทดสอบเรียก phpinfo() อีกครั้งหนึ่ง ก็จะปรากฏคำว่า mod_rewrite ซึ่งตอนนี้สามารถใช้งานได้แล้ว
ขั้นที่ 2 เขียนไฟล์ .htaccess เพื่อเขียน Rewrite Rule ลงในเว็บไซต์ ตามที่ได้เกริ่นไว้ในหัวย่อหน้าก่อนนี้ หลังจากเปิดให้ Apache สามารถรองรับ Module ของ mod_rewrite ได้แล้ว การทำงานต่าง ๆ ต่อไปก็เป็นหน้าที่ของไฟล์ .htaccess ซึ่งเป็นไฟล์ที่ทำหน้าที่รับคำสั่งจาก เว็บไซต์ เพื่อส่งให้ Apache แปลงคำสั่งและส่งผลลัพธ์กลับมา โดยไฟล์ .htaccess จะต้อถูกตัดเก็บไว้ใน Root ของเว็บไซต์ ซึ่งในที่นี้จะต้องเก็บไว้ที่
C:\Appserv\www\modrewrite\.htaccess
หรือกรณีที่ Path อยู่ใน Sub ของ Folder ก็จะต้อง นำไฟล์นี้ไปเก็บไว้ใน Sub โฟเดอร์เช่นเดียวกัน และในกรณีที่ใช้ .htaccess อยู่ใน Sub Folder จะต้องเพิ่ม AllowOverride All ใน httpd.conf เข้าไปด้วยครับ เช่น
httpd.conf
<Directory "C:/Appserv/www/modrewrite/"> AllowOverride All </Directory>
การเริ่มต้นคำสั่ง Rewrite จะเริ่มต้นด้วย
.htaccess
RewriteEngine on
ตัวอย่าง 1
เปลี่ยนจาก /viewdetail.php?id=1234 เป็น /view/1234/
รูปแบบ
http://localhost:8081/viewdetail.php?id=1234
ในไฟล์ viewdetail.php เราจะได้ค่า $_GET[“id”] = 1234;
ต้องการเปลี่ยนเป็น
http://localhost:8081/view/1234/
เขียน RewriteEngine เป็น
RewriteEngine On RewriteRule ^view/([0-9]+)/$ viewdetail.php?id=$1 RewriteRule ^view/([0-9]+)$ /view/$1/ [R]
viewdetail.php
<? echo "id=".$_GET["id"]; ?>
เมื่อพิมพ์ URL ว่า http://localhost:8081/view/1234/
ใน php สามารถใช้การ $_GET[“id”] เพื่อใช้งานได้
คำอธิบาย
RewriteRule ^view/([0-9]+)/$ viewdetail.php?id=$1
(เมื่อมีการรับค่าในรูปแบบ /view/1234/ ให้เรียกไฟล์ viewdetail.php?id=$1 พร้อมกับส่งค่า $1 คือตำแหน่งที่ 1 = ([0-9]+) )
RewriteRule ^view/([0-9]+)$ /view/$1/ [R]
(ตัวนี้ตรวจสอบรูปแบบ /view/1234 และแทนที่ /view/1234/ (Slash) ให้อัตโนมัติ)
ตัวอย่าง 2
เปลี่ยนจาก /viewdetail.php?id=1234 เป็น /view/1234.html
รูปแบบ http://localhost:8081/viewdetail.php?id=1234
ในไฟล์ viewdetail.php เราจะได้ค่า $_GET[“id”] = 1234;
ต้องการเปลี่ยนเป็น http://localhost:8081/view/1234.html
เขียน RewriteEngine เป็น
RewriteEngine On RewriteRule ^view/(.*).html /viewdetail.php?id=$1
viewdetail.php
<? echo "id=".$_GET["id"]; ?>
เมื่อพิมพ์ URL ว่า http://localhost:8081/view/1234.html
ใน php สามารถใช้การ $_GET[“id”] เพื่อใช้งานได้
รูปแบบอื่น ๆ เช่น
/viewdetail.php?id=1234 เป็น /view/detail-1234.html
RewriteEngine On RewriteRule ^view/detail-(.*).html /viewdetail.php?id=$1
/viewdetail.php?id=1234 เป็น /view/details-1234/
RewriteEngine On RewriteRule ^view/details-([0-9]+)/$ viewdetail.php?id=$1 RewriteRule ^view/details-([0-9]+)$ /view/$1/ [R]
ตัวอย่าง 3
เปลี่ยนจาก /viewdetail.php?id=1234 เป็น /view-1234.html
รูปแบบ
http://localhost:8081/viewdetail.php?id=1234
ในไฟล์ viewdetail.php เราจะได้ค่า $_GET[“id”] = 1234;
ต้องการเปลี่ยนเป็น
http://localhost:8081/view-1234.html
เขียน RewriteEngine เป็น
RewriteEngine On RewriteRule ^view-(.*).html /viewdetail.php?id=$1
ตัวอย่าง 4 เปลี่ยนจาก /viewdetail.php?id=1234&keyword=ajax-tutorial เป็น /1234/ajax-tutorial.html
รูปแบบ
http://localhost:8081/viewdetail.php?id=1234&keyword=ajax-tutorial
ในไฟล์ viewdetail.php เราจะได้ค่า $_GET[“id”] = 1234; และ $_GET[“keyword”] = ajax-tutorial;
ต้องการเปลี่ยนเป็น
http://localhost:8081/1234/ajax-tutorial.html
เขียน RewriteEngine เป็น
RewriteEngine On RewriteRule ^(.*)/(.*).html /viewdetail.php?id=$1&keyword=$2
viewdetail.php
<? echo "id=".$_GET["id"]; echo "<br>"; echo "keyword=".$_GET["keyword"]; ?>
เมื่อพิมพ์ URL ว่า http://localhost:8081/1234/ajax-tutorial.html
ใน php สามารถใช้การ $_GET[“id”] เพื่อใช้งานได้
รูปแบบอื่นๆ เช่น
/viewdetail.php?id=1234&keyword=ajax-tutorial เป็น /1234/ajax-tutorial/
RewriteEngine On RewriteRule ^(.*)/(.*)/$ /viewdetail.php?id=$1&keyword=$2
เพิ่มเติม
สำหรับบทความนี้เป็นเพียงแนะนำพื้นฐานการใช้ Mod Rewrite ของ Apache Module ซึ่งการประยุกต์ใช้กับ PHP และ MySQL เพื่อให้ได้เห็นตัวอย่างและแนวทางการทำไปใช้งานจริง สามารถอ่านได้จากบทความตัดไป หรือคลิกได้จากบทความที่เกี่ยวข้อง ที่อยู่ท้ายของบทความ
ระวัง Error
การแก้ไขไฟล์ .htaccess ค่อนข้างจะต้องมีความระมัดระวังเพระาถ้าหาก Syntax ไม่ถูกต้อง ก็อาจจะทำให้เว็บไซต์ Error ทั้งเว็บเลยก็เป็นได้ ตาม Error นี้
สำหรับการเขียนรูปแบบอื่น ๆ อยากให้ลองศึกษา URL นี้
http://httpd.apache.org/docs/current/mod/mod_rewrite.html
เพราะความสามารถของ .htaccess นั้นสามารถเขียนได้หลากหลาย เช่นการเปลี่ยนแปลงค่า config ซึ่ง php.ini บางตัว หรือการตรวจสอบ Web Browser ต่าง ๆ ก็สามารถทำได้เช่นเดียวกัน
http://www.thaicreate.com/community/mod-rewrite-url-friendly-seo-apache-module.html