ทำ SEO ให้ URL โดยใช้ Mod_Rewrite

Mod_Rewrite คืออะไร?
Mod_Rewrite คือการแปลง URL ที่ดูยากให้อยู่ในรูปแบบที่เราต้องการ เพื่อประโยชน์หลายด้าน (ซึ่งจะกล่าวถึงต่อไป) และการแปลงเพื่อประโยชน์ด้าน SEO ก็เป็นอีกอันนึงที่มีการนำเอา Mod_Rewrite มาใช้ เพราะเรารู้กันดีว่า Search Engine ไม่ค่อยชอบ pages ที่เป็น dynamic ที่มี query string ยาวเฟื๊อย

ตัวอย่าง URL ที่ยาว และซับซ้อน
โค้ด:

http://www.site.com/viewcatalog.asp?category=hats&prodID=53

เมื่อผ่านการแปลง เราสามารถทำให้สั้นลงได้ดังนี้
โค้ด:

http://www.site.com/catalog/hats/53/

เริ่มทำ Mod_Rewrite
บาง Server ไม่สามารถจะทำ Mod_Rewrite ได้เนื่องจากไม่ได้ติดตั้ง Module Mod_Rewrite ดังนั้นถ้าเราจำเป็นต้องใช้ Mod_Rewrite ก็ต้องตรวจสอบดีๆก่อนเช่า host

.htaccess ไฟล์สำคัญในการทำ Mod_Rewrite
เราจะใช้ไฟล์นี้ในการกำหนด Rule ของการทำ Mod_Rewrite
เริ่มต้นด้วยคำสั่ง

RewriteEngine on

เพื่อเปิดการทำงาน เขียนไว้ในบรรทัดแรกสุดของไฟล์

ต่อไปจะเป็นการนำเอา Mod_Rewrite ไปให้งาน ซึ่งผมจะเริ่มด้วยตัวอย่างง่ายๆ และเขียน Rewrite Rule ง่ายก่อน แล้วก็ยกตัวอย่างต่อไปเรื่อยๆนะครับ

ใช้ Mod_Rewrite ในการทำ Redirects
ถ้าเราต้องการเปลี่ยน location เก่า ไปที่ Location ใหม่แบบถาวร

RewriteEngine on
RewriteRule ^old\.html$ new.html

ถ้าเราเขียนแบบนี้ เมื่อมีการใส่ url เป็น old.html มันก็จะถูกส่งไปที่ไพล์ new.html แต่ผู้เยี่ยมชมยังเห็น URL บน browser เป็น old.html อยู่เหมือนเดิม

อาจจะดูงงๆ อธิบายเพิ่มเติมดังนี้ RewriteRule จะประกอบด้วยกัน 3 ส่วน
1. Call to action RewriteRule ขึ้นต้นบรรทัด กำหนดว่าบรรทัดนี้เป็น Rewrite Rule
2. Pattern ^old\.html$ เป็นการตรวจสอบ URL ที่ใส่เข้ามาทาง Location Bar ของ Browser ซึ่งจะใช้ regex (Regular Expression) ในการตรวจสอบ (จะอธิบายเพิ่มเติมต่อไป)
3. Rewrite new.html เป็น URL ที่เราต้องการให้แปลงเป็นอันใหม่
หมายเหตุ: จริงๆมี 4 ส่วน แต่ในตัวอย่างเราใช้ 3 ส่วน

ขออธิบายในส่วนที่ 2 (Pattern) เพิ่มเติมดังนี้ ในส่วนนี้ประกอบด้วยเครื่องหมายสำคัญ 3 อย่างคือ
^old\.html$
- เครื่องหมาย The caret หรือ ^ เป็นการกำหนดจุดเริ่มต้น URL ที่อยู่ภายใต้ direcory ปัจจุบันที่เราจะตรวจสอบ ซึ่งก็คือ directory เดียวกับไฟล์ .htaccess
- เครื่องหมาย The dollar sign หรือ $ ซึ่งบอกจุดสิ้นสุดของการตรวจสอบ Pattern
- อีกเครื่องหมายนึงก็คือ The period หรือ . จุด ที่อยู่ข้างหน้านามสกุล html ซึ่งเครื่องหมาย จุด นั้นเป็นอักขระพิเศษ ใน regular expressions ซึ่งจะมีความหมายว่า แทนด้วยตัวอักษรใดๆ 1 ตัว (ดูเพิ่มเติมใน regular expressions ต่อจากนี้) แต่ในนี้เราจะตรวจสอบว่า ถ้า Pattern เป็น old.html หรือไม่ เราจึงต้องใส่ \ ซึ่งเป็น escape charactor ไว้ด้วย

เมื่อเราเขียนตามนี้ เมื่อผู้เยี่ยมชมเว็บกรอกมาเป็น old.html server ก็จะทำ transparently redirect ไปที่ new.html โดยที่ผู้เยี่ยมชมเว็บไม่รู้ตัวว่าเป็นข้อมูลอันใหม่แล้ว เพราะ URL บน browser เป็น old.html อยู่เหมือนเดิม

แต่ถ้าเราต้องการให้ URL ที่ปรากฏบน browser เป็น new.html ด้วย เราก็เพียงแต่เติม [R] เข้าไปต่อท้ายบรรทัด ดังนี้

RewriteRule ^old\.html$ new.html [R]

ซึ่ง [R] ก็คือ ส่วนที่ 4 ที่ผมบอกไว้ข้างบน
4. Command Flag [R] ซึ่งจะเป็นคำสั่งพิเศษกำหนดเงื่อนไขไว้ มีหลายคำสั่งซึ่งจะบอกไว้ตอนท้าย
การใช้ Regular Expressions
จะบอกว่า เป็นส่วนสำคัญที่สุดในการทำ Rewrite และมันก็ทำความความเข้าใจได้ยากพอควร ไม่ต้องห่วงครับ เดี๋ยวผมจะอธิบายเป็นขั้นตอน และยกตัวอย่างประกอบไปเรื่อยๆนะครับ

ตัวอย่างแรก

RewriteRule ^products/([0-9][0-9])/$ productinfo.php?prodID=$1

จะเปลี่ยนจาก

productinfo.php?prodID=11 หรือ productinfo.php?prodID=99

ให้เป็น

products/11/ หรือ products/99/

ดูที่ Pattern จะมีส่วนของที่อยู่ในปีกกาเหลี่ยม [ ] เราเรียกว่า ranges
ในตัวอย่างจะเป็น [0-9] ซึ่งจะใช้ตรวจสอบว่าเป็นตัวอักษรที่อยู่ในช่วง 0-9 ใดๆ
เราสามารถตรวจสอบ ranges อื่นได้ เช่น [A-Z] ตรวจสอบว่าเป็นตัวอักษรตัวใหญ่ตั้งแต่ A-Z
[a-z] ก็เป็นการตรวสอบตัวเล็ก, ถ้า [A-Za-z] ก็ตรวจสอบว่าเป็นทั้งตัวใหญ่และตัวเล็ก เป็นต้น

และใน Pattern ก็จะมีส่วนที่อยู่ในวงเล็บ ( ) เป็นการเก็บค่าที่เราตรวจสอบพบ และตรงตามเงื่อนไข ซึ่งเราสามารถเอาค่านี้ ส่งไปให้ PHP ในส่วนของ Query String ได้ เราเรียกค่าที่ได้จากวงเล็บนี่ว่า back-reference
เราสามารถตรวจสอบและแยก back-reference ออกได้หลายๆอันใน URL อันเดียว (ดูตัวอย่างต่อๆไป) ซึ่ง back-reference ในวงเล็บแรก เวลาเราอ้างถึงเราก็จะใช้ $1 ส่วนลำดับต่อๆไป ก็จะเป็น $2, $3 ไปเรื่อยๆ

ดังนั้นผู้เยี่ยมชมเว็บ(หรือ bot ก็ได้)ก็จะเห็น url เป็น products/11/ หรือ products/99/ ซึ่ง สั้นและกระชับ โดยหารู้ไม่ว่า เราได้ซ่อน URL ที่ไม่ค่อยสวยงามและอ่านยากไว้เบื้องหลัง

ใส่ / ต่อท้าย
บางครั้งผู้เยี่ยมชมเว็บ อาจจะพิมพ์ URL แค่ products/12 ซึ่งเมื่อเข้าไปตรวจสอบใน Pattern ด้านบน ก็จะไม่ตรง เพราะ Pattern ด้านบนจะต้องมี / ต่อท้ายด้วย มันจึงไม่ทำ transparently redirect ให้เรา
เราก็มีวิธีแก้เหตุการณ์แบบนี้ ซึ่งเราก็จะเขียน Rule ใหม่เพิ่มเข้าไปดังนี้

RewriteRule ^products/([0-9][0-9])$ products/$1/ [R]
RewriteRule ^products/([0-9][0-9])/$ productinfo.php?prodID=$1

ดังนั้น เมื่อ Server ตรวจเจอ products/12 ก็จะเปลี่ยน URL เป็น products/12/ และแสดง URL ให้บน Browser ด้วย เพราะเราใส่ [R] ไว้ด้วย เมื่อเจอเงื่อนไขบรรทัดที่ 2 ก็เลยไม่มีปัญหาใดๆ ซึ่งมันก็จะส่งเป็น transparently redirect ไปที่ productinfo.php?prodID=12 ตามความต้องการของเรา

การใช้ Match Quantifiers
จะเป็นว่าตัวอย่างข้างบน เรากำหนดเป็น ^products/([0-9][0-9])$ นั่นหมายความว่า ตัวเลขที่ตามหลัง products/xx ต้องมี 2 ตัวเท่านั้น ซึ่งก็จะเป็นไปได้สูงสุดแค่ 99 แล้วกรณี productinfo.php?prodID=100 ล่ะจะทำอย่างไร?
ในกรณีนี้ เราสามารถใช้ Quantifiers เป็นตัวกำหนดได้ (Quantifiers มีหลายตัว จะอธิบายต่อไปเรื่อยๆ) ดังตัวอย่าง

RewriteRule ^products/([0-9]+)$ products/$1/ [R]

เครื่องหมายบวก + แทนอักษรตั้งแต่ 1 ตัว ถึง n ตัว (ตั้งแต่ 1 ตัวขึ้นไป) ดังนั้น [0-9]+ ก็หมายความว่า เป็นตัวเลข 0-9 ตั้งแต่ 1 หลักขึ้นไป ถ้าเราใส่ products/1 หรือ products/1000 ก็สามารถ Match case นี้ได้แล้วครับ

ข้อมูลเพิ่มเติมของ Rewrite Rule

RewriteRule

Regular expressions

Some hints about the syntax of regular expressions:

Text:
. Any single character
[chars] One of chars
[^chars] None of chars
text1|text2 text1 or text2

Quantifiers:
? 0 or 1 of the preceding text
* 0 or N of the preceding text (N > 0)
+ 1 or N of the preceding text (N > 1)

Grouping:
(text) Grouping of text

Anchors:
^ Start of line anchor
$ End of line anchor

Escaping:
\ char escape that particular char

Pattern Matching metacharacter Definitions
\ Use before any of the following characters to escape or null the meaning or it. \* \. \$ \+ \[ \]
^ Start matching at this point
$ End point of the match
. Any character
[] Starts a range
| Starts alternative match this|that would mean match this or that
() starts a back reference point
? match 0 or 1 time Quantifier
+ match atleast 1 or more times Quantifier
* match 0 to infinite times Quantifier
{} match minimum to maximum Quantifier {0,3} match up to 3 times

Range Definitions []
^ Negates the class. [^A-Z]+ means don’t match any uppercases
\ Use before any of the following characters to escape or null the meaning or it. [\+]+
- Range for matching [0-9]+ [a-zA-Z]+

Command Flag
[R] Redirect you can add an =301 or =302 to change the type.
[F] Forces the url to be forbidden. 403 header
[G] Forces the url to be gone 401 header
[L] Last rule. (You should use this on all your rules that don’t link together)
[N] Next round. Rerun the rules again from the start
[C] Chains a rewrite rule together with the next rule.
[T] use T=MIME-type to force the file to be a mime type
[NS] Use if no sub request is requested
[NC] Makes the rule case INsensitive
[QSA] Query String Append use to add to an existing query string
[NE] Turns of normal escapes that are default in the rewriterule
[PT] Pass through to the handler (together with mod alias)
Skip the next rule S=3 skips the next 3 rules
[E] E=var sets an enviromental variable that can be called by other rules

ข้อมูลจาก http://www.thaiseoboard.com/index.php/topic,3675.0.html

Related posts

51 ความเห็น »

  1. dech said,

    พฤษภาคม 15, 2008 @ 10:38 pm

    ละเอียดมากครับ ขอบคุณมาก:)

  2. Teague said,

    พฤษภาคม 20, 2008 @ 4:24 pm

    แล้ถ้าเป็นภาษาไทย ต้องเขียน RegEx ยังไงอ่ะครับ

  3. Mekz said,

    พฤษภาคม 23, 2008 @ 6:54 pm

    เยี่ยมมากเลยครับ ข้อมูลน่าสนใจจริงๆ:d/

  4. Petch said,

    พฤษภาคม 27, 2008 @ 10:32 pm

    แล้วจะทราบได้อย่างไรครับว่า Host ที่เราเช่าอยู่มันทำ Mod_Rewrite ได้
    1.โทรไปถาม
    2.ดูจากไฟล์หรือรายละเอียดบน Host ของเรา

  5. divland's people said,

    พฤษภาคม 28, 2008 @ 10:27 am

    ของผมใช้วิธีถาม ครับ แต่ส่วนใหญ่ตอนนี้ก็มักจะใช้ได้ เกือบทุกที่นะครับ ขนาดใช้โฮสต์ฟรี ก็ยัง Mod_rewrite ได้เลย

  6. Samui Hotels said,

    มิถุนายน 2, 2008 @ 9:18 pm

    ได้ความรู้มากๆ เลยครับ หลังจากมึนมานาน วันนี้ เริ่มเข้าใจแล้วละครับ ขอบคุณมาก:)

  7. เอเองครับ said,

    มิถุนายน 4, 2008 @ 7:27 am

    ขอบคุณครับ กำลังตามหาวิธีจัดการเจ้า mod_rewrite อยู่พอดีเลย :d/

  8. TaTump said,

    มิถุนายน 10, 2008 @ 11:16 pm

    บทความละเอียดดีมากเลยครับ:)>-

  9. naruto said,

    กรกฎาคม 9, 2008 @ 10:32 pm

    ขอบคุณมากเลยครับ จะเอาไปลองทำดู ถ้าติดตรงไหนจะมาถามนะครับ :)

  10. partyman said,

    กรกฎาคม 13, 2008 @ 12:33 am

    Thank you ..

    Good article:d

  11. NinNin said,

    สิงหาคม 13, 2008 @ 9:35 am

    มีประโยชน์มากเลยครับ กำลังศึกษาเรื่อง SEO อยู่เลย

    ขอบคุณมากครับ

    :d

  12. thailand hotels said,

    ตุลาคม 7, 2008 @ 11:18 pm

    ได้ประโยชน์เยอะเลย ขอบคุณสำหรับความรู้ดีๆ ครับ

  13. คุณโอ๋ said,

    ตุลาคม 19, 2008 @ 3:40 pm

    ใช่ครับ บาง Host ก็ใช้ Mod Rewrite ไม่ได้

    ผมเคยทำโดยไม่ได้สอบถามก่อน ผลก็คือ หน้าเว็บเดี้ยง ต้องแจ้งโฮสต์ให้แก้ไขไฟล์ Config ให้ (ผมใช้งานกับซับโดเมน ที่ขับเคลื่อนด้วย จู่มล่า) ดังนั้นก่อนแก้ ต้องสอบถามโฮสต์ก่อนนะครับ

    แต่ใน Wp ไม่ค่อยมีปัญหานะ เรามีทางเลือกเยอะ:)

  14. SilliconValley said,

    ธันวาคม 23, 2008 @ 4:42 pm

    คือทำแล้วมีปัญหาเรื่อง path css อะครับ เช่น /job/employer/
    ถ้า sub ซ้อนเข้าไปไม่ตรงกับ sub ที่ไฟล์ css เก็บมันจะเรียกใช้ css ไม่ได้อะครับ
    ไม่ทราบว่าต้องเขียน rule ยังไงครับ

  15. NatZ said,

    ธันวาคม 23, 2008 @ 5:38 pm

    กระจ่างแจ่มแจ้ง เลยครับ

    เป็นประโยชน์มากๆ

    ขอบคุณครับ:d/

  16. divland said,

    ธันวาคม 23, 2008 @ 10:31 pm

    อันนี้ไม่น่าจะเกี่ยวกับ css เลยนะครับ เพราะอันนี้คือการเรียกเพจ ส่วน css เราก็เรียกใช้ในเพจตามปกติครับ แนจ่นอนว่าเราต้องระบุโฟลเดอร์ ไปจนถึงไฟล์ css ครับ

  17. msn said,

    มกราคม 15, 2009 @ 4:21 pm

    ผมทำไม่ได้เลยอ่า ไม่รู้เป็นอะไร บางอันได้บางอันไม่ได้

  18. private student said,

    มกราคม 16, 2009 @ 9:39 am

    เยี่ยม เข้าใจมากขึ้นเลย

  19. กก said,

    มกราคม 16, 2009 @ 9:45 am

    ลองดูๆ:d

  20. hostdomain said,

    มกราคม 16, 2009 @ 9:22 pm

    ข้อมูลเยอะ น่าสนใจ
    อธิบายง่าย เข้าใจดี
    ขอบคุณครับ

  21. แชท said,

    กุมภาพันธ์ 2, 2009 @ 3:26 pm

    ดีมากครับ แต่ยังทำไม่ได้ -*-

  22. eBay said,

    กุมภาพันธ์ 5, 2009 @ 1:22 am

    ดูแล้วก็มึนๆ เดี๋ยวไว้ต้องไปปฎิบัติในเวบดูอีกที :-?

  23. SilliconValley said,

    กุมภาพันธ์ 11, 2009 @ 9:23 am

    ที่คุณ Divland พูด นี่หมายถึง ต้องระบุ path ของ css เป็นแบบ absolute url เลยเหรอครับ

  24. divland said,

    กุมภาพันธ์ 11, 2009 @ 10:44 am

    ผมหมายถึงว่า path css มันอยู่ในไฟล์อะครับ ไม่ได้ปรากฏที่ address bar แต่การ rewrite url เราทำให้เกิดผลที่ url เวลาที่เราป้อนที่ address bar ซึ่งไม่น่าจะเกี่ยวข้อกัน ถ้าเพจนั้นจะเรียก css ไม่ได้อะครับ เอ.. หรือผมเข้าใจคำถามผิดไป :-?

  25. SEO Rider said,

    กุมภาพันธ์ 27, 2009 @ 2:37 am

    เยี่ยมเลยครับบทความนี้ ละเอียดยิบทีเดียว
    หามานานแล้วครับ

  26. stan said,

    มีนาคม 28, 2009 @ 12:40 am

    เดี๋ยวจะลองไปทำดูครับ ^_^

  27. SEO said,

    เมษายน 2, 2009 @ 4:03 pm

    rewrite url นี้ถือเป็นพื้นฐานของเว็บไซต์ที่ผมทำทุกๆ เว็บเลยครับ

  28. nin said,

    เมษายน 25, 2009 @ 9:24 am

    พอดี hosting ผมไม่สนับสนุนน่ะครับ

    ถ้าแจ้งเขา เขาจะเปิดให้ใช้ระบบ mod rewrite ได้ไหมครับ

    host เดี๋ยวนี้ส่วนใหญ่สนับสนุนหมดแล้วใช่ไหมครับ

  29. tum said,

    มิถุนายน 24, 2009 @ 8:41 pm

    ขอรบกวนสอบถามว่า แล้วมันจะมีผลกับการโดน deindex จาก SE มั้ยครับ เพราะกลัวว่ามันจะเป็น duplicate หรือเปล่า

  30. utt said,

    มิถุนายน 24, 2009 @ 8:56 pm

    เท่าที่ใช้มา วิธีนี้ดีกับ SE ครับ ไม่มีปัญหาแต่อย่างใด

  31. เพลงฟรี said,

    สิงหาคม 30, 2009 @ 11:16 pm

    ปัญหาของผมคือเรือ่งของ Regular expression อ่ะคับ ยากมาก งงด้วย

  32. เว็บดูหนัง said,

    สิงหาคม 30, 2009 @ 11:19 pm

    ทำ seo มีผลมาก ๆ เลยค่ะ

  33. ฟังเพลง เนื้อเพลง said,

    กันยายน 17, 2009 @ 2:55 pm

    ขอบคุณสำหรับแนวทางค่ะ

  34. ดูหนังออนไลน์ said,

    ตุลาคม 19, 2009 @ 1:50 pm

    เวปนี้สวยงามมากครับ ได้ความรู้มากมายจากdivland เยอะมาก ขอบคุณครับ

  35. brushes photoshop lady said,

    ตุลาคม 26, 2009 @ 8:00 pm

    น่าเอาไปทำ ขอบคุณค่ะ

  36. ilovevariety said,

    พฤศจิกายน 3, 2009 @ 12:47 pm

    อธิบายเข้าใจง่ายดีครับ แต่ผมเข้าใจยากเอง T^T

  37. รถยก said,

    พฤศจิกายน 6, 2009 @ 8:40 pm

    ลองทำดูกับภาษาไทย ไม่ออกแฮะ สงสัยได้กลับไปใช้ WP เหมือนเก่า:((

  38. ฟังเพลงใหม่ said,

    พฤศจิกายน 9, 2009 @ 5:00 pm

    ได้ความรู้มากครับ แต่ลองทำดูแล้วยัง งงๆอยู่ ต้องศึกษาใหเเยอะกว่านี้ ขอบคุณครับ

  39. ดูหนัง said,

    พฤศจิกายน 16, 2009 @ 12:03 pm

    .htaccess ยังไม่รองรับภาาษาไทยครับ

  40. ดูหนังออนไลน์ said,

    พฤศจิกายน 16, 2009 @ 1:02 pm

    ต้องลองหัดก่อน อิอิ ขอบคุณค่ะ

  41. Samsung LED TV said,

    พฤศจิกายน 20, 2009 @ 2:34 pm

    อ่านแล้วงงๆแต่จะลองทำดูครับ:-?

  42. Zhu Zhu Pets said,

    พฤศจิกายน 20, 2009 @ 2:43 pm

    อธิบายได้เข้าใจดีครับ เว็บก็สวยสบายตาขอบคุณนะครับ

  43. premkamon said,

    พฤศจิกายน 29, 2009 @ 3:09 pm

    ขอบคุณมากครับบบ อธิบายได้เข้าใจง่ายมากครับบบ=d>=d>

  44. โหลดmp3 said,

    ธันวาคม 6, 2009 @ 4:02 pm

    Thank you for good information

  45. เพลงฟรี said,

    ธันวาคม 6, 2009 @ 4:03 pm

    แนวนี้ชอบมากเลยครับ

  46. ดูทีวีย้อนหลัง said,

    ธันวาคม 16, 2009 @ 11:44 pm

    เป็นบทความที่ดีมากครับ :d/

  47. mukluk boots said,

    มกราคม 20, 2010 @ 3:29 pm

    ขอบคุณครับ :((

  48. prim said,

    กุมภาพันธ์ 12, 2010 @ 10:26 pm

    Thanks for this beneficial article :)

  49. โปรโมทเว็บฟรี said,

    กุมภาพันธ์ 24, 2010 @ 7:28 pm

    ขอบจายคร๊าบ:):)

  50. รับออกแบบเว็บไซต์ said,

    มีนาคม 1, 2010 @ 10:53 am

    มีประโยชน์มากครับช่วยให้ URL Friendly กับการ SEO มากครับ:):)

  51. จองโรงแรมภูเก็ตออนไลน์ said,

    มีนาคม 16, 2010 @ 9:29 am

    ขอบคุณมากครับ :)>-

RSS feed for comments on this post · TrackBack URI

ให้ความเห็น

:) :( :d :"> :(( \:d/ :x 8-| /:) :o :-? :-" :-w ;) [-( :)>- more »

email

จัดส่งถึงที่ โดย

ลิ้งค์สำหรับ rss reader


ischool
ลงโฆษณา ติดต่อ cssmaster@divland.com

Recent Comments:

WOMAN wondercutie.com LOAD uploadtoday.com FISH Ninekaow.com