กรณีการใช้งานจริง สำหรับ mod_rewrite ของ Apache - ฉบับที่ 165 สิงหาคม 2009

โดย Anderson Silva

แปลโดย Sake

เทคโนโลยีเป็นสิ่งที่น่าขบขัน. บางครั้ง คุณต้องการที่จะเขียนถึงมันเพียงบางส่วนโดยเฉพาะ.
บางครั้ง, คุณต้องการจะแบ่งปันความรู้กับบางคน, แต่ในการทำ, และทำให้ดี, คุณรู้สึกถึงความจำเป็น
ที่จะอธิบายเทคโนโลยีทั้งหมด ที่ต้องใช้ในการสร้างส่วนที่เฉพาะเจาจงนั้นให้สำเร็จ.

บทความนี้ ไม่ได้กล่าวถึงว่า mod_rewrite ทำงานจริง ๆ ได้อย่างไร.
ถ้าต้องการทราบ ผมอาจจะต้องเขียนเกี่ยวกับสิ่งต่าง ๆ อย่าง : โปรโตคอล HTTP , Apache HTTP Server,
นิพจน์ปกติ (Regular Expression), และอื่น ๆ อีกเล็กน้อย.

คน ๆ หนึ่งไม่ได้จำเป็นต้องทราบว่ารถยนต์ทำงานอย่างไร,
จากทฤษฎีของฟิสิกส์ทั้งหมดที่จะสร้างเครื่องยนต์กลไกมันขึ้นมา,
เพื่อที่จะสามารถขับขี่ได้, ถูกต้องใช่มั้ย?
เพราะฉะนั้น, บทความนี้จะไม่ไปยุ่งกับการทำงานข้างใต้ เมื่อทำการจัดการกับ mod_rewrite.
แต่จะแสดงเพียงว่าเปิดมันอย่างไร, และทำงานกับมันอย่างไร.

ถ้าอย่างนั้น, mod_rewrite ดีอย่างไร? มันทำงานรวดเร็ว, และยังยืดหยุ่น
พอสมควรและมัศักยภาพในเชิงซับซ้อน ที่จะจัดการกับ URL ในด้านเครื่องแม่ข่ายโดยการใช้กฎของนิพจน์ปกติ.
คุณสามารถจับความสัมพันธ์ของการร้องขอ HTTP ด้วยเงื่อนไขหลากหลาย อย่างตัวแปรเครื่องแม่ข่าย, ส่วนหัว HTTP และอื่น ๆ.

ผมไม่แน่ใจเกี่ยวกับตัวแจกจ่ายลินุกซ์อื่น, แต่บน Fedora ที่ผมเลือกใช้, Apache HTTP Server ถูกลงแยกจากเครื่อง พร้อมกับ mod_rewrite ทำงาน, แต่ถูกปิดไว้.

ในการเปิดใช้ เพียงแค่เพิ่ม:

RewriteEngine On

ใน httpd.conf ของคุณ, หรือถ้าคุณทำการใช้งานโฮสต์เสมือนบนเครื่องแม่ข่ายของคุณ, คุณสามารถเปิดใช้งาน mod_rewrite ในแต่ละโฮสต์เสมือนของคุณ.

ตอนนี้, ถ้าคุณใช้งานกับนิพจน์ปกติแล้ว, และคุณไม่ได้สะดวกสบายกับมัน,
มันง่ายมากที่จะถูกทำให้เป็นผู้พ่ายแพ้โดยมัน. ในการที่จะทำให้สิ่งต่าง ๆ ง่ายขึ้น,
mod_rewrite ได้สร้างตัวเก็บบันทึกระบบมาด้วย เพื่อที่จะช่วยผู้ดูแลในการแก้ปัญหากฎต่าง ๆ.

การเปิดใช้บันทึกการทำงาน mod_rewrite ของคุณ:

RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 5

อย่างน้อย, นี่เป็นวิธีที่คุณจะเริ่มทำงานกับ และพร้อมที่จะแก้ปัญหากับมัน.

สี่ตัวอย่างในการใช้งานจริง:

1. บริษัทที่คุณทำงานให้ ส่งสิ่งตีพมพ์ด้านการตลาดบางอย่างออกไปข้างนอก, และบางคนตระหนักว่า
URL ที่พิมพ์บนปกของเอกสารผิด. มันถูกคาดหวังว่าจะต้องเป็น:
http://www.yourcompany.com/ask_me_how/, แต่มันกลับถูกพิมพ์เป็น
http://www.yourcompany.com/ask-me-how/ แทน. นี่อาจจะเป็นปัญหาที่พื้นฐานและดั้งเดิมมากที่สุดของ mod_rewrite: กำหนดให้ URL, เปลี่ยนทิศทางใหม่จากผู้ใช้ไปยังที่อื่น. นี่เป็นวิธีการที่จะแก้ไขมัน:

RewriteRule ^/ask-me-how/$ /ask_me_how/ [R,L]

2. เว็บไซต์บริษัทของคุณมีสองชื่อโดเมน: www.yourcompany.com
และ www.yourcompany.net. เจ้านายคุณแจ้งว่า ขณะที่ค้นหาด้วย Google นั้น ผลการค้นหาได้ถูกปฏิบัติให้เป็นสองไซต์ที่ต่างกัน. เขาต้องการที่จะค้นหา วิธีการ ที่จะบอก Google ว่าทั้งสองโดเมนนั้น ควรจะถูกปฏิบัติให้เป็นไซต์เดียว.

ในการตั้งค่า Apache ของคุณ, เปิดใช้ mod_rewrite, และเปลี่ยนทิศทางใหม่ของการจราจรของคุณโดยการใช้ การเปลี่ยนทิศทางถาวร (Permanent Redirect) HTTP code 301. โดยมาตรฐาน, การเปลี่ยนทิศทางใหม่ของmod_rewrite
คือ 302 การเปลี่ยนทิศทางชั่วคราว (Temporary Redirects), และ Google search ยังคงจัดเรียงโดเมนเป็นแบบสองเอกลักษณ์ที่ต่างกัน.

RewriteCond %{HTTP_HOST} ^yourcompany.net$ [OR]
RewriteCond %{HTTP_HOST} ^www.yourcompany.net$
RewriteRule ^.*$ http://www.yourcompany.com/$1 [R=301,L]

3. สมมติว่า คุณมีเว็บไซต์ที่สนับสนุนทั้งการเชื่อมต่อมาตรฐานและแบบปลอดภัย (อย่างเช่น HTTP และ HTTPS), และเจ้านายของคุณต้องการให้คุณ, โดยปราศจากการบอกล่วงหน้า (หรืออย่างอื่น) ที่จะบังคับการจราจร http:// ทั้งหมดจะถูกเปลี่ยนทิศทางไปเป็น https:// . งั้น ถ้าคุณกำลังใช้งาน Apache และ
mod_rewrite ถูกเปิดใช้งาน, ที่คุณต้องการก็คือบรรทัดข้างล่างนี้:

RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}/$1 [R,L,NE]

4. จินตนาการถึงสถานการณ์ที่,มีเหตุผลหนึ่ง หรืออย่างอื่น, คุณต้องการที่จะหยุดการเชื่อม (link) ที่สร้างจากไซต์อื่น ๆ มายังไซต์ของคุณ. บางที ไซต์ที่ไม่ได้รับอนุญาตพบช่องโหว่ในการบุกรุกยังโปรแกรมประยุกต์ของคุณ และสร้างลิงค์ที่มีสำหรับผู้คน เพื่อดาวน์โหลดเอกสารที่มีลิขสิทธ์บางอย่าง. คุณสามารถใช้ mod_rewrite เพื่อที่จะหยุดการร้องขอใด ๆ ที่มาจากไซต์นั้น โดยการจับคู่
HTTP_REFERER ของการร้องขอที่เข้ามา. แม้ว่านี่อาจจะไม่ใช่คำตอบท้ายสุด, แต่ที่ผมคาดว่าบริษัทของคุณอาจต้องใช้เวลาที่จะปิดช่องโหว่นั้น, นี่อาจจะเป็นสิ่งที่มีในมือสำหรับคำตอบฉุกเฉินแบบรวดเร็ว.

RewriteCond %{HTTP_REFERER} http://www.hackersite.net [NC]
RewriteRule - [F]

อธิบายวากยสัมพันธ์(syntax)โดยย่อ:

RewriteCond - นี่เป็นคำสั่งที่อนุญาตให้คุณทดสอบสภาวะบางอย่างสำหรับกฎที่จะนำมาใช้.
คิดว่ามันเป็นถ้อยแถลง(statement) if ของภาษาในการเขียนโปรแกรมที่คุณใช้อยู่ทุกวัน,
สองสภาวะหรือมากกว่าสามารถถูกเขียนอย่างเป็นลำดับอย่างตรรกะ AND, หรือโดยการเพิ่ม [OR]
ที่ท้ายของบรรทัดสำหรับตรรกะ [OR]. คุณจะเห็นได้ว่า RewriteCond เป็นสิ่งที่ยืดหยุ่น และอนุญาตให้คุณที่จะเขียนการทดสอบสำหรับตัวแปรเครื่องแม่ข่ายอย่างส่วนหัว HTTP, การเชื่อมต่อและการร้องขอ, ส่วนภายในเครื่องแม่ข่าย, หรือแม้แต่ข้อมูลระบบ.

RewriteRule - เป็นคำสั่งที่สำคัญที่สุดที่คุณใช้.
มันเป็นสิ่งที่ตามเอกสารของ Apache เรียกใช้งานมัน, เป็น 'ม้างานในการเขียนใหม่จริง ๆ' ของโมดูล
mod_rewrite. มันมักจะใช้ 3 พารามิเตอร์: รูปแบบในการจับคู่, สายอักขระที่จะแทนที่, และรายการของเครื่องหมาย. นี่คือรายการของเครื่องหมายที่ผมเพิ่งใช้บนตัวอย่างข้างต้น:

R - บอก RewriteRule ว่าคุณกำลังทำการเปลี่ยนทิศทางใหม่, และ,
นอกจากคุณใส่รหัส 301, มันจะมีค่ามาตรฐานเป็น 302, ซึ่งหมายถึงย้ายชั่วคราว.

L - บอก RewriteRule ให้ออกจากสายโซ่ของกฎ และไม่ตามกฎใด ๆ หลังจาก RewriteRule ล่าสุด.

NC - ทำให้รูปแบบการจับคู่เป็นแบบอักขระเล็กใหญ่ไม่สำคัญ.

NE - บอก RewriteRule ไม่ต้องหลีก (escape) ผลของ URI กับสิ่งที่มีลักษณะคล้ายกับ %20 สำหรับที่ว่าง.

สรุปท้ายสุด

mod_rewrite ของ Apache เป็นเครื่องมือที่ความยืดหยุ่นอย่างไม่น่าเชื่อ
ในการอนุญาตให้ผู้ดูแลระบบ ที่จะทำงานอย่างรวดเร็ว ในการแก้ไขประเด็นปัญหากับเครื่องแม่ข่ายเว็บ.
การแก้ไขบ้งอย่างอาจจะเป็นแบบลักษณะชั่วคราวจนกว่าคำตอบถาวรที่เหมาะสมนำมาใช้, และ,
ถึงแม้ว่ามันอาจจะดีมากกว่ากว่าเมื่อ mod_rewrite อาจจะเป็นส่วนหนึงของการแก้ปัญหาถาวร,
อน่าใช้มันมากเกินไป, เพราะกฎของ mod_rewrite อาจสะสมอย่างรวดเร็ว และเป็นสิ่งที่ยากต่อการดูแลมัน.
คุณเคยที่ดูแลโค้ดภาษา Perl code ที่มี regexes อยู่ทุก ๆ ที่มั้ย? ถ้าเคย, คุณก็อาจจะรู้ว่าผมพูดอะไรอยู่.

ท้ายสุด, ถ้าคุณต้องการที่จะรู้มากกขึ้นว่า ข้างใต้ของ mod_rewrite มีอะไรอยู่,
ให้แน่ใจว่า คุณอ่าน เอกสารคู่มือของ Apache แล้ว, และเมื่อสงสัย ใช้บันทำกการทำงานของ
mod_rewrite เพื่อช่วยคุณในการแก้ไขปัญหา.

แหล่งข้อมูลภายนอก

1. http://www.w3.org/Protocols/rfc2616/rfc2616.html

2. http://httpd.apache.org

3. http://en.wikipedia.org/wiki/Regular_expression

4. http://groups.google.com/group/Google_Webmaster_Help/web/faqs-for-crawling-indexing-and-ranking-2?pli=1

5. http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html


Talkback: สนทนาเกี่ยวกับบทความนี้กับ The Answer Gang


[BIO]

แอนเดอสัน ซิลวา (Anderson Silva) ทำงานเป็นวิศวกรการออกวางจำหน่ายสารสนเทศที่ Red Hat, Inc.
เขาจบปริญญาตรีด้านวิทยาการคอมพิวเตอร์จากบมหาวิทยาลัยลิเบอร์ตี, ปริญญาโทด้ายระบบข้อมูลจากมหาวิทยาลัยมาอีน.
เขาเป็นวิศวกรรับรองของหมวกแดง (Red Hat Certified Engineer), และ และเป็นผู้เขียนบทความด้านลินุกซ์หลายแห่งเพื่อการเผยแพร่: Linux Gazette,
Revista do Linux, และ Red Hat Magazine. แอนเดอสันได้แต่งง่านกับหวานใจสมัยมัธยมปลายมาแล้ว 11 ปี, มีลูก 3 คน. เมื่อเขาไม่ได้ทำงานเขียน, เขามีความสุขกับการใช้เวลากับครอบครัว, ดูรถสูตร 1 และแข่งรถอิสระ, และพูดคุยเรื่องรถโกคาร์ทกับลูกชาย.


สงวนลิขสิทธิ์ ปี 2009, Anderson Silva. ออกวางภายใต้สัญญาอนุญาต Open Publication license เว้นแต่บันทึกภายในบทความบอกเป็นอย่างอื่น. Linux Gazette ไม่ได้ถูกสร้างขึ้น, ได้รับการสนับสนุน, หรือได้รับการรับรอง จากผู้ให้ใช้โฮสต์, SSC, Inc.

ตีพิมพ์ในเล่มที่ 16ถ ของ of Linux Gazette, สิงหาคม 2009