AGMS#3: Rewrite ทำไม Regex ช่วยได้


Posted in:

ไม่นานนี้ผมลองทำเว็บใหม่ ออกมาแนวๆ Twitter นั่นแหละครับ(ลอกมันมาเลยว่าง่ายๆ :P)
แรกๆทำไปก็ยังไม่มีอะไรครับ จนมาถึงจะต้องทำหน้าให้ผู้ใช้ทีละคน ทีนี้ปกติเราเขียน php จะรับค่าแบบนี้ใช่ไหมครับ

u.php?u=whs

เวลาเรียก $_GET['u'] ก็จะเป็น whs แต่ว่าแบบนี้ใครๆเขาก็ใช้กัน แล้วมันก็ยาวไม่สมเป็น geek ก็เลยคิดวิธีต่อไป เป็นวิธีแก้ปัญหาอีกแบบที่ผมชอบใช้เวลารับ argument ตัวเดียว

u.php?whs

แบบนี้มันก็ยังมีคนใช้บ้างครับ โดยดึงค่าจาก $_SERVER['QUERY_STRING'] แทน แต่ว่ามันก็ไม่เท่ ทำแบบ rewrite นั่นแหละเท่ที่สุดครับ

rewrite มันคือการที่เราสร้าง url เสมือนได้ โดยที่ว่าเราไม่ต้อง folder จริงๆ จะเห็นได้ในบางเว็บครับ เช่นอย่างของคลับเรานี้ จริงๆไม่ได้มี folder node ที่เห็นใน url หรอกครับ มันมาจาก rewrite แต่ครั้นจะใช้ rewrite ผมก็ไม่รู้วิธีใช้มันซะอีก - -" ก็เลยเล่น hacks ดีกว่า

นึกย้อนไป ผมเคยฟลุ๊ค ลืมใส่ extension(นามสกุล) ไฟล์ทีนึง ปรากฎว่าไฟล์เปิดได้เฉยเลย ก็เลยสงสัยว่าทำไมมันได้ ลองไฟล์อื่นก็ได้หมด พอมาลองคอมผมมันก็ได้ แสดงว่า ubuntu ใส่ให้ไว้เลยครับ ไม่ต้องแก้อะไรเพิ่ม
(ถ้าเคยโหลดวิดีโอจาก youtube สังเกตนะครับว่าหน้าที่จะดึงวิดีโอชื่อ get_video แต่จริงๆมันเข้าผ่าน get_video.php ก็ได้ครับ แสดงว่า youtube ก็ใช้)
เสร็จแล้วยังมีอีกเรื่องที่น่าจะต้องรู้คือ apache เนี่ยครับ มันสามารถเรียกไฟล์แล้วส่ง argument เป็นแบบ folder ได้ ถ้าไม่เห็นภาพดูในบอร์ดคลับครับ ลองอ่านกระทู้ดูสังเกตว่าจะเป็น index.php/บลาๆๆ แบบนี้ครับ ซึ่งตรงนี้เนี่ยจากที่บอร์ดมันว่า บอกว่าได้แค่ apache เท่านั้นนะครับ ตัวอื่นอด

ลองเอาสองอย่างที่บอกมารวมกันครับ โดยที่ว่าผมสร้างไฟล์อันนึง คือ u.php แล้วเวลาเรียกก็เรียกด้วย u เฉยๆ จากนั้นก็ส่งผ่าน argument เหมือน folder แค่นี้ก็ดูเหมือน rewrite แล้วครับ

แล้ว regex เกี่ยวอะไร? มันจะมีประโยชน์ตรงที่ว่า เวลาเรียก u/whs เนี่ยครับ php ไม่ได้กำหนดตัวแปรไหนเป็น whs ให้เราเลย แต่ว่าจะมีตัวแปรนึงครับที่บอกว่า url ที่เรียกคืออะไร ได้แก่ $_SERVER['REQUEST_URI'] ครับ ดังนั้น ถ้าจะเอาแค่ whs ออกมา ก็ต้องให้ regex ช่วยครับ โดยผมเขียน regex ดังนี้

1. คิดก่อนว่าผมจะเขียนแบบไหน ก็คือหาดู /u/อะไรก็ได้ ที่อยู่ท้ายสุดของ url
2. แปลงเป็น regex ขั้นแรก /\/u/(.*)/ อันนี้ยังไม่ได้เช็คเรื่องท้ายสุด (ถ้าเขียน regex เป็นจะเห็นนะครับว่าไม่ใส่ ? เพราะว่ามันจะดึงที่เหลือมาหมดเลย ไม่ใส่ก็ได้
3. ขั้นสุดท้าย /\/u/(.*)$/ เติม $ ไปตัวนึงตรงท้าย เพื่อบอกว่าอยู่ท้ายสุดของ url

ถ้าใ้ช้ php จะออกดังนี้ครับ

<?php
$uri=$_SERVER['REQUEST_URI'];
preg_match("/\/u\/(.*)$/", $uri, $r);
$user = $r[1];

แค่นี้เองง่ายๆครับ :)

 

ปล. ระวังเรื่อง path ด้วยนะครับ เพราะว่า web browser จะเข้าใจว่าเป็น folder จริงๆ เวลาเรียกใช้ภาพต่างๆแบบ relative ต้องใส่ ../ ด้วยนะครับ แต่ว่าเวลา include ใน php หรือเปิดไฟล์ต่างๆ ไม่ต้องใส่ ../ นะครับ
ปล2. http://whsgroup.ath.cx/~whs/yado/u/whs  อันนี้คือที่ผมใช้ครับ

Alias

มาแถมให้ว่าถ้า Server ไม่แปลง Directory เป็นไฟล์ให้อัตโนมัติ เราสามารถทำเป็น Alias ก็ได้ครับ (เหมือน MediaWiki)

Alias /u /full/path/to/u.php

หรือถ้าจะ Rewrite แบบเปลี่ยนชื่อตัวแปรให้เลย ก็ประมาณนี้

RewriteRule ^u/(.*)$ /u.php?u=$1 เวลาเรียกใช้ก็เรียกจาก $_GET['u'] ได้เลยครับ

GreenApple's picture

โอ้ว

น้องwillwillกะลัง ทำอะไรที่ผมทำพอดีเลย

แต่ผมทำที่ apache เลยตรงๆ - -"

เมื่อวานเจอคนนึงเหมือน willwill มาก แต่น่าจะแก่กว่าผม

นึกในใจ น้อง willwill ในอนาคตชัดๆ

น่าจะขอถ่ายรูปเลย - - จะได้เอามาให้ดู เหมือนจริงๆ

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
  • Allowed HTML tags: <i> <center> <span> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <br> <dt> <dd> <object> <embed> <hr> <img> <blockquote> <b> <u> <del> <div> <p> <table> <tr> <td> <font>

More information about formatting options