mod rewrite สักนิดครับ มันไม่ไปตามที่เราต้องการ


ผมสร้างโฟลเดอร์ชื่อ rewrite พร้อมมี .htaccess ไว้ในโฟลเดอร์ และไฟล์ index.php 



ในไฟล์ .htaccess มีดังนี้

Options +FollowSymlinks


RewriteEngine on


RewriteBase /rewrite/


 


RewriteCond %{HTTP_HOST} ^localhost$


RewriteRule ^index\.php$ index.php?module=main [L,QSA]



ผมอยากให้มันตอนที่เข้าหน้า index.php ให้มันโชว์ url 

http://localhost/...ndex.php?module=main

แต่อ url ที่ผมรัน ขึ้น http://localhost/rewrite/

ต้องแก้ตรงไหนหรอครับ ช่วยชี้แจงทางสว่างให้ผมที

 

15 ก.ค. 2555 7 4,206

ถ้าใช้ L,QSA บน addressbar จะเหมือนเดิม แต่มีค่า module ส่งไป



ถ้าต้องการให้เปลี่ยนเส้นทางไปเลย ใช้ R,L ครับ



RewriteRule ^index\.php$ /index.php?module=main [R,L]

#1


Options +FollowSymlinks


RewriteEngine on


RewriteBase /rewrite/


 


RewriteCond %{HTTP_HOST} ^localhost$


RewriteRule ^index\.php$ /index.php?module=main [R,L]




ข้อมูลใน index.php ไม่ขึ้นครับ

#2

มันไป index..php หรือเปล่าละ



สามารถตรวจสอบได้โดยพิมพ์ print_r($_GET); ในไฟล์ index.php เพื่อดูว่ามันมาที่นั่นหรือเปล่าครับ
#3

mod rewrite สักนิดครับ มันไม่ไปตามที่เราต้องการ
ไม่ได้ครับ 

ไฟล์ .htaccess


Options +FollowSymlinks


RewriteEngine on


RewriteBase /rewrite/


RewriteCond %{HTTP_HOST} ^localhost$


RewriteRule ^index\.php$ index.php?module=main [R,L]

ไฟล์ index.php


<?php


  print_r($_GET);


?>

อยู่ในโฟลเดอร์ rewrite ทั้งหมด

พิมพ์ url นี้ http://localhost/rewrite/index.php

มันก้อเปลี่ยนเส้นทางไป http://localhost/rewrite/index.php?module=main

แล้วมันก็ขึ้นดังภาพ




#4

ออ....ไม่ต้องแปลกใจ



ปัญหาก็คือ มันเปลี่ยนเส้นทางไปยังไฟล์เดิม ดังนั้นมันจึงมี loop ไม่สิ้นสุด index.php => index.php?module=main => index.php?module=main



การแก้ไข...ผมก็ไม่แน่ใจเหมือนกันว่าคำสั่งที่จะทำให้มันหยุด loop คืออะไร จริงๆก็น่าจะประมาณว่า ให้ตรวจสอบว่า module เท่ากับ main ไม่ต้อง redirect แต่....



ปัญหาก็คือถ้าเธอทำเช่นนั้นก็น่าจะมีปัญหาอีกมากมายตามมา เพราะ เธออาจไม่ได้ใช้แค่ module=main อาจมี parameter อื่นๆอีกได้ ซึ่งวิธีข้างต้นจะไม่ครอบคลุม



จริงๆแล้วเราสามารถทำคำสั่งดังกล่าวด้วย PHP แทนได้ โดยไม่จำเป็นต้อง redirect



<?php

  // index.php

  $module = isset($_GET['module']) ? $_GET['module'] : 'main';

?>



คำสั่งด้านบนหมายความว่า ถ้าไม่มีค่า module ส่งมา ให้ใช้ module=main และ แน่นอน เราสามารถส่งค่าโมดูลเป็นค่าอื่นๆได้ด้วย โดยไม่จำเป็นต้อง redirect
#5

แล้วถ้าจะเปลี่ยนไปคล้ายเว็บอาจารย์ล่ะครับ การทำงานมันเป็นยังงัยครับ

ที่ทำได้ตอนนี้คือสามารถเปลี่ยนเป็น http://localhost/rewrite/?module=main

แล้วถ้าอยากได้เป็นอย่างนี้ล่ะครับ 
http://localhost/rewrite/#module=main ผมเห็นว่ามันสวยกว่าเลยอยากได้ครับ

ไฟล์ .htaccess


Options +FollowSymlinks


RewriteEngine on


RewriteBase /rewrite/


RewriteCond %{HTTP_HOST} ^localhost$


RewriteRule ^index\.php$ ?module=main [R,L]

อยากเปลี่ยน เครื่องหมาย ? เป็น # ครับ 

#6

อ้างอิงจาก ความคิดเห็น #6แล้วถ้าจะเปลี่ยนไปคล้ายเว็บอาจารย์ล่ะครับ การทำงานมันเป็นยังงัยครับ

ที่ทำได้ตอนนี้คือสามารถเปลี่ยนเป็น http://localhost/rewrite/?module=main

แล้วถ้าอยากได้เป็นอย่างนี้ล่ะครับ 
http://localhost/rewrite/#module=main ผมเห็นว่ามันสวยกว่าเลยอยากได้ครับ

ไฟล์ .htaccess


Options +FollowSymlinks


RewriteEngine on


RewriteBase /rewrite/


RewriteCond %{HTTP_HOST} ^localhost$


RewriteRule ^index\.php$ ?module=main [R,L]

อยากเปลี่ยน เครื่องหมาย ? เป็น # ครับ 



555++ คำตอบง่ายๆ คือใช้ GCMS ครับ



วิธีของมันจริงๆถ้าจะอธิบายก็เขียนหนังสือได้เป็นเล่มๆละครับ คงยังไม่สะดวกจะอธิบายในตอนนี้ เอาคร่าวๆว่ามันเกี่ยวข้องกับ GAjax (Ajax FrameWork) และอีกหลายๆสิ่งครับ



จริงๆแล้วก็มี FrameWork อื่นๆเช่น jquery ที่สามารถใช้ความสามารถลักษณะนี้ครับ แต่ก็ไม่ง่ายนักที่จะทำให้เสมบูรณ์



ผมว่า วิธีที่ตั้งใจไว้แหละครับ ง่ายสุด เพียงแต่เธออาจยังไม่เข้าใจว่า mod_rewrute มันทำอะไร เธอถึงได้ใช้ไม่ถูก แนะนำให้อ่านบทความบนเว็บประกอบครับ
#7
ความคิดเห็น
ไฟล์อัปโหลด ชนิด jpg, jpeg ขนาดไฟล์ไม่เกิน 1024
^