GORAGOD.com

ปัญหาการใช้ mod_rewrite

มีคำถามจากบอร์ดเกี่ยวกับ mod_rewrite ซึ่ง เป็นปัญหาข้อผิดพลาดเล็กน้อยแต่ทำเอาหลงทางไปหลายคน ซึ่งผมเห็นว่าน่าสนใจดีเพราะหลายคนที่พยายามทำอยู่อาจหลงทางกับปัญหานี้ได้
อ้างอิงจาก หัวข้อพอดีกำลังหัดเขียน Mod_rewrite ค่ะติดปัญหาตรงตอนลิงค์แล้ว url มันไม่เปลี่ยนค่ะคือมันต่อกันเลยค่ะอันนี้ตัวอย่างค่ะ
 
ไฟล์ชื่อ index.php

<a href="category/icon/car/">Link 1 </a><br>
<a href="write/picture/home/">Link 2 </a><br />
<strong> แสดง ผล :<? echo $_GET['a']."-".$_GET['b']."-".$_GET['c'] ;?></strong>

ไฟล์ .htaccess

RewriteEngine on
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?a=&b=&c= [L]

พอเรา คลิกลิงค์ที่ 1 ได้นะค่ะ

/category/icon/car/

แต่พอจะคลิก ลิงค์ที่1หรือ2 อีกทีมันจะขึ้นแบบนี้ค่ะคือมันจะต่อกันไปเรื่อยๆค่ะ

/category/icon/car/write/picture/home/

คำถามนี้ค่อนข้างเป็นปัญหาหญ้าปากคอกครับ เนื่องจากคำถามนี้ หลายๆคนคงพยายามไปแก้ไขที่ตัว mod_rewrite ต่างๆนาๆ และโทษว่ามันผิด ทั้งๆที่อันที่จริงแล้ว ที่ผิดอยู่ที่คนเขียนไม่รอบคอบครับ และไม่ได้อยู่ที่ mod_rewrite

คำถามนี้ขออธิบายด้วยภาพนะครับ ในตอนที่คลิกลิงค์ครั้งแรก URL และ ผลลัพท์ จะเป็นดังรูป ซึ่งก็เป็นไปตามปกติละครับ มันสามารถทำงานได้ถูกต้อง แต่เมื่อคลิกในครั้งที่ 2 ไม่ว่าจะลิงค์เดิมหรือลิงค์อื่น ผลลัพท์มันกลับไม่เป็นไปตามที่คาดหวัง

สังเกตุที่ URL บน Address Bar ที่มันเอามาต่อกันนะครับ

อย่างที่ผมบอก ปัญหานี้ไม่ได้เกิดจาก mod_rewrite แก้ให้ตายมันก็ไม่หมดปัญหา แต่ปัญหามันไปอยู่ที่ ลิงค์ที่ใช้ครับ
<a href="category/icon/car/">Link 1 </a>
<a href="write/picture/home/">Link 2 </a>

ดูเผินๆมันก็ไม่มีอะไรนะครับ แต่จะว่าไป มันก็ไม่ค่อยถูกกฏซะเท่าไร ลอง alert ลิงค์แรกออกมาดูนะครับ
<script type="text/javascript">
alert(document.links[0].href );
</script>

ทำไมจึงเป็นเช่นนั้น
คำตอบอยู่ที่ การเขียนลิงค์ครับ <a href="category/icon/car/">Link 1 </a> เมื่อคุณไม่ได้ระบุ URL แบบเต็มๆ tag a จะไปเอา URL มาจาก Address Bar มาต่อกับ path หรือไฟล์ตามที่ tag ระบุไว้ ซึ่งนั่นจะกลายเป็น http://localhost/category/icon/car/category/icon/car/ สีแดง คือ URL บน Address Bar (ไม่รวมชื่อไฟล์ ถ้ามี เช่น index.php) และ สีเขียว คือ URL ที่ระบุใน tag

การแก้ไขก็ตรงไปตรงมาครับ ระบุ URL เต็มๆลงใน tag ก็เสร็จแล้ว
<a href="http://localhost/category/icon/car/">Link 1 </a>
<a href="http://localhost/write/picture/home/">Link 2 </a>

ปัญหานี้เป็นสิ่งที่อาจเกิดขึ้นได้เสมอ เมื่อมีการใช้ mod_rewrite ครับ เนื่องจาก Browser จะเอา URL มาจาก Address Bar เสมอหากไม่ระบุ URL แบบครบถ้วนมา ซึ่งไม่ได้มีเพียงแค่นี้นะครับ tag อื่นๆก็เป็นไปตามกฏนี้ด้วยเช่นกัน เช่น tag img หรือ style หรืออะไรก็ตามที่มีการอ้างที่อยู่ของไฟล์ ดังนั้นเพื่อความปลอดภัย หากเราใช้ mod_rewrite เมื่อไร เราควรเขียน URL ต่างๆ (ทั้งหมด) บนเว็บของเราโดยระบุ URL แบบเต็มๆไปยังไฟล์เสมอ (หรือเพื่อให้เป็นนิสัยที่ดี เราควร ระบุที่อยู่ของไฟล์ แบบเต็มๆเสมอ)