เพื่อให้เข้าใจว่า mod_rewrite คุณต้องเข้าใจว่าเว็บเซิร์ฟเวอร์ทำงานอย่างไร ตอบสนองเว็บเซิร์ฟเวอร์เพื่อร้องขอ HTTP คำขอ HTTP ที่ระดับพื้นฐานที่สุดจะมีลักษณะดังนี้:
GET /foo/bar.html HTTP/1.1
นี่เป็นคำของ่ายๆของเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์ที่ขอURL /foo/bar.html
จากมัน เป็นสิ่งสำคัญที่จะต้องเน้นว่ามันไม่ได้ร้องขอไฟล์มันจะขอแค่ URL ที่กำหนดเอง คำขออาจมีลักษณะเช่นนี้:
GET /foo/bar?baz=42 HTTP/1.1
นี่เป็นเพียงการร้องขอ URL ที่ถูกต้องและมีความชัดเจนมากขึ้นเกี่ยวกับไฟล์
เว็บเซิร์ฟเวอร์เป็นแอปพลิเคชั่นที่รับฟังพอร์ตยอมรับคำขอ HTTP ที่เข้ามาในพอร์ตนั้นและส่งคืนการตอบกลับ เว็บเซิร์ฟเวอร์นั้นมีอิสระที่จะตอบสนองต่อการร้องขอใด ๆ ในลักษณะที่เห็นว่าเหมาะสม / ไม่ว่าคุณจะกำหนดค่าให้ตอบสนองอย่างไร การตอบสนองนี้ไม่ใช่ไฟล์เป็นการตอบสนอง HTTPซึ่งอาจมีหรือไม่มีอะไรเกี่ยวข้องกับไฟล์ฟิสิคัลบนดิสก์ใด ๆ เว็บเซิร์ฟเวอร์ไม่จำเป็นต้องเป็น Apache มีเว็บเซิร์ฟเวอร์อื่น ๆ อีกมากมายซึ่งทั้งหมดเป็นเพียงโปรแกรมที่ทำงานอย่างต่อเนื่องและเชื่อมต่อกับพอร์ตที่ตอบสนองต่อคำขอ HTTP คุณสามารถเขียนเอง ย่อหน้านี้มีวัตถุประสงค์เพื่อหย่าคุณจากความคิดใด ๆ ที่ URL เท่ากับไฟล์โดยตรงซึ่งเป็นเรื่องสำคัญที่จะต้องเข้าใจ :)
การกำหนดค่าเริ่มต้นของเว็บเซิร์ฟเวอร์ส่วนใหญ่คือการค้นหาไฟล์ที่ตรงกับ URL บนฮาร์ดดิสก์ หากตั้งค่ารูทเอกสารของเซิร์ฟเวอร์เป็นพูด/var/www
อาจดูว่ามีไฟล์/var/www/foo/bar.html
อยู่หรือไม่และให้บริการหากเป็นเช่นนั้น หากไฟล์ลงท้ายด้วย ".php" ไฟล์จะเรียกล่าม PHP จากนั้นส่งคืนผลลัพธ์ การเชื่อมโยงทั้งหมดนี้สามารถกำหนดค่าได้อย่างสมบูรณ์ ไฟล์ไม่จำเป็นต้องลงท้ายด้วย ".php" เพื่อให้เว็บเซิร์ฟเวอร์เรียกใช้ผ่านตัวแปล PHP และ URL ไม่จำเป็นต้องจับคู่ไฟล์ใด ๆ บนดิสก์เพื่อให้มีบางอย่างเกิดขึ้น
mod_rewrite เป็นวิธีการเขียนการจัดการคำขอภายในใหม่ เมื่อเว็บเซิร์ฟเวอร์ได้รับคำขอ URL /foo/bar
คุณสามารถเขียน URL นั้นใหม่เป็นอย่างอื่นก่อนที่เว็บเซิร์ฟเวอร์จะค้นหาไฟล์บนดิสก์เพื่อจับคู่ ตัวอย่างง่ายๆ:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
กฎนี้บอกว่าเมื่อใดก็ตามที่คำขอตรงกับ "/ foo / bar" ให้เขียนใหม่เป็น "/ foo / baz" คำขอจะได้รับการจัดการราวกับว่า/foo/baz
ได้รับการร้องขอแทน สามารถใช้กับเอฟเฟ็กต์ต่างๆเช่น:
RewriteRule (.*) $1.html
กฎนี้ตรงกับสิ่งใด ( .*
) และจับมัน ( (..)
) จากนั้นเขียนใหม่เพื่อผนวก ".html" กล่าวอีกนัยหนึ่งถ้า/foo/bar
เป็น URL ที่ร้องขอมันจะถูกจัดการราวกับว่า/foo/bar.html
ได้รับการร้องขอ ดูhttp://regular-expressions.infoสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจับคู่นิพจน์ปกติการจับภาพและการแทนที่
กฎอื่นที่พบบ่อยคือ:
RewriteRule (.*) index.php?url=$1
สิ่งนี้จะจับคู่สิ่งใด ๆ และเขียนลงในไฟล์ index.php อีกครั้งด้วย URL ที่ร้องขอ แต่เดิมผนวกเข้ากับurl
พารามิเตอร์การสืบค้น นั่นคือสำหรับคำขอใด ๆ และทั้งหมดที่เข้ามาไฟล์ index.php จะถูกดำเนินการและไฟล์นี้จะสามารถเข้าถึงคำขอต้นฉบับ$_GET['url']
ได้ดังนั้นจึงสามารถทำสิ่งที่ต้องการได้
หลัก ๆ แล้วคุณวางกฎการเขียนซ้ำเหล่านี้ลงในไฟล์กำหนดค่าเว็บเซิร์ฟเวอร์ของคุณ Apache ยังอนุญาตให้คุณใส่ลงในไฟล์ที่เรียกว่า.htaccess
ภายในรูทเอกสารของคุณ (เช่นถัดจากไฟล์. php)
* หากได้รับอนุญาตจากไฟล์กำหนดค่า Apache หลัก มันเป็นตัวเลือก แต่เปิดใช้งานบ่อย
สิ่งที่ mod_rewrite ไม่ทำ
mod_rewrite ไม่ได้ทำให้ URL ของคุณ "สวย" ทั้งหมดอย่างน่าอัศจรรย์ นี่เป็นความเข้าใจผิดที่พบบ่อย หากคุณมีลิงค์นี้ในเว็บไซต์ของคุณ:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
ไม่มีสิ่งใดที่ mod_rewrite สามารถทำได้เพื่อทำให้มันสวย ในการทำให้ลิงก์นี้เป็นลิงก์ที่สวยงามคุณต้อง:
เปลี่ยนลิงค์เป็นลิงค์สวย:
<a href="https://stackoverflow.com/my/pretty/link">
ใช้ mod_rewrite บนเซิร์ฟเวอร์เพื่อจัดการการร้องขอไปยัง URL /my/pretty/link
โดยใช้วิธีใดวิธีหนึ่งที่อธิบายไว้ข้างต้น
(สามารถใช้mod_substitute
ร่วมกันเพื่อแปลงหน้า HTML ขาออกและลิงก์ที่มีอยู่แม้ว่านี่จะเป็นความพยายามมากกว่าการอัพเดททรัพยากร HTML ของคุณ)
มี mod_rewrite จำนวนมากที่สามารถทำได้และกฎการจับคู่ที่ซับซ้อนมากที่คุณสามารถสร้างรวมถึงการผูกหลาย rewrites คำขอ proxying ไปยังบริการที่แตกต่างกันโดยสิ้นเชิงหรือเครื่องกลับรหัสสถานะ HTTP เฉพาะเป็นการตอบสนองคำขอเปลี่ยนเส้นทาง ฯลฯ มันมีประสิทธิภาพมากและสามารถใช้ ดีมากถ้าคุณเข้าใจกลไกการตอบสนองคำร้องขอ HTTP พื้นฐาน มันไม่ได้ทำให้ลิงก์ของคุณสวยโดยอัตโนมัติ
ดูเอกสารอย่างเป็นทางการสำหรับธงและตัวเลือกที่เป็นไปได้ทั้งหมด