ยินดีต้อนรับ กรุณา สมัครสมาชิก หรือเข้าสู่ระบบ

Home » webboard » PHP
เข้าชม : 2706

การทำ url ภาษาไทย ด้วย mod rewrite

โพสต์เมื่อ: วันจันทร์ 7 พฤษภาคม 2555  20:01 น.

[ ความเห็นที่ 1]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันจันทร์ 7 พฤษภาคม 2555  20:02 น.

แต่ เวลา ทำลิ้ง url ให้ใส่  rawurlencode ไปด้วย

เช่น

$a=rawurlencode("เว็บสนุก")."html";

เวลาใส่ลิ้งก็  เว็บสนุก

อะไรแบบนี้อะ
 


[ ความเห็นที่ 2]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันจันทร์ 7 พฤษภาคม 2555  22:10 น.
ส่ง 2 ค่า

RewriteRule ^([^/]*)-([^/]*)\.html$ /product.php?catID=$1&catName=$2 [L]


[ ความเห็นที่ 3]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันอังคาร 8 พฤษภาคม 2555  13:00 น.
อันนี้มีวีดีโอสอนด้วยครับ ไปดูเองครับ

http://www.hosttook.com/support-joomla/website-tips-and-technique/110-how-to-create-thai-url-with-modrewrite-htaccess.html
[ ความเห็นที่ 4]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันอังคาร 8 พฤษภาคม 2555  13:26 น.
อันนี้จะทำเป็น ฐานข้อมูลด้วย

http://www.scriptdd.com/webtip/apache-mod-rewrite-easy-url.html


[ ความเห็นที่ 5]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันอังคาร 8 พฤษภาคม 2555  19:22 น.
ถ้าต้องการตัดคำที่ต้องการ

$vowels = array(" ","#","!","%", "@","?","'","\""); // replace # และช่องว่างใน seo url
$seo_url = str_replace($vowels,"_", $row['topic']);

แล้วก็link เป็น <a href=$seourl-เลขid.htmlของคุณก็ว่าไป></a>
[ ความเห็นที่ 6]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันพุธ 9 พฤษภาคม 2555  00:43 น.
ตัวอย่าง
จากเดิม
http://www.yoursite.com/shop/view.php?id=555&name=nokia3210

ต้องการเปลี่ยนเป็น

http://www.yoursite.com/555/nokia3210.html

ต้องเขียนดังนี้

RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)\.html$ /shop/view.php?id=$1&name=$2 [L]


[ ความเห็นที่ 7]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันพุธ 9 พฤษภาคม 2555  00:52 น.
RewriteBase /abc/

อันนี้คือระบุโฟลเดอร์
[ ความเห็นที่ 8]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันพุธ 9 พฤษภาคม 2555  00:56 น.

บทความ
การแปลง URL โดยใช้ Mod_Rewrite

Mod_Rewrite คืออะไร?
Mod_Rewrite คือการแปลง URL ที่ดูยากให้อยู่ในรูปแบบที่เราต้องการ เพื่อประโยชน์หลายด้าน (ซึ่งจะกล่าวถึงต่อไป) และการแปลงเพื่อประโยชน์ด้าน SEO ก็เป็นอีกอันนึงที่มีการนำเอา Mod_Rewrite มาใช้ เพราะเรารู้กันดีว่า Search Engine ไม่ค่อยชอบ pages ที่เป็น dynamic ที่มี query string ยาวเฟื๊อย

ตัวอย่าง URL ที่ยาว และซับซ้อน

โค๊ด:
http://www.site.com/viewcatalog.asp?category=hats&prodID=53
เมื่อผ่านการแปลง เราสามารถทำให้สั้นลงได้ดังนี้

โค๊ด:
http://www.site.com/catalog/hats/53/

เริ่มทำ Mod_Rewrite
บาง Server ไม่สามารถจะทำ Mod_Rewrite ได้เนื่องจากไม่ได้ติดตั้ง Module Mod_Rewrite ดังนั้นถ้าเราจำเป็นต้องใช้ Mod_Rewrite ก็ต้องตรวจสอบดีๆก่อนเช่า host

.htaccess ไฟล์สำคัญในการทำ Mod_Rewrite
เราจะใช้ไฟล์นี้ในการกำหนด Rule ของการทำ Mod_Rewrite
เริ่มต้นด้วยคำสั่ง

RewriteEngine on


เพื่อเปิดการทำงาน เขียนไว้ในบรรทัดแรกสุดของไฟล์

ต่อไปจะเป็นการนำเอา Mod_Rewrite ไปให้งาน ซึ่งผมจะเริ่มด้วยตัวอย่างง่ายๆ และเขียน Rewrite Rule ง่ายก่อน แล้วก็ยกตัวอย่างต่อไปเรื่อยๆนะครับ

ใช้ Mod_Rewrite ในการทำ Redirects
ถ้าเราต้องการเปลี่ยน location เก่า ไปที่ Location ใหม่แบบถาวร


 

RewriteEngine on
RewriteRule ^old\.html$ new.html


ถ้าเราเขียนแบบนี้ เมื่อมีการใส่ url เป็น old.html มันก็จะถูกส่งไปที่ไพล์ new.html แต่ผู้เยี่ยมชมยังเห็น URL บน browser เป็น old.html อยู่เหมือนเดิม

 

อาจจะดูงงๆ อธิบายเพิ่มเติมดังนี้ RewriteRule จะประกอบด้วยกัน 3 ส่วน
1. Call to action RewriteRule  ขึ้นต้นบรรทัด กำหนดว่าบรรทัดนี้เป็น Rewrite Rule
2. Pattern  ^old\.html$ เป็นการตรวจสอบ URL ที่ใส่เข้ามาทาง Location Bar ของ Browser ซึ่งจะใช้ regex (Regular Expression) ในการตรวจสอบ (จะอธิบายเพิ่มเติมต่อไป)
3. Rewrite  new.html  เป็น URL ที่เราต้องการให้แปลงเป็นอันใหม่
หมายเหตุ: จริงๆมี 4 ส่วน แต่ในตัวอย่างเราใช้ 3 ส่วน

ขออธิบายในส่วนที่ 2 (Pattern) เพิ่มเติมดังนี้ ในส่วนนี้ประกอบด้วยเครื่องหมายสำคัญ 3 อย่างคือ
^old\.html$
- เครื่องหมาย The caret หรือ ^ เป็นการกำหนดจุดเริ่มต้น URL ที่อยู่ภายใต้ direcory ปัจจุบันที่เราจะตรวจสอบ ซึ่งก็คือ directory เดียวกับไฟล์ .htaccess
- เครื่องหมาย The dollar sign หรือ  $ ซึ่งบอกจุดสิ้นสุดของการตรวจสอบ Pattern
- อีกเครื่องหมายนึงก็คือ The period หรือ . จุด ที่อยู่ข้างหน้านามสกุล html ซึ่งเครื่องหมาย จุด นั้นเป็นอักขระพิเศษ ใน regular expressions ซึ่งจะมีความหมายว่า แทนด้วยตัวอักษรใดๆ 1 ตัว (ดูเพิ่มเติมใน regular expressions ต่อจากนี้) แต่ในนี้เราจะตรวจสอบว่า ถ้า Pattern เป็น old.html หรือไม่ เราจึงต้องใส่ \ ซึ่งเป็น escape charactor ไว้ด้วย

เมื่อเราเขียนตามนี้ เมื่อผู้เยี่ยมชมเว็บกรอกมาเป็น old.html server ก็จะทำ  transparently redirect ไปที่ new.html โดยที่ผู้เยี่ยมชมเว็บไม่รู้ตัวว่าเป็นข้อมูลอันใหม่แล้ว เพราะ URL บน browser เป็น old.html อยู่เหมือนเดิม

แต่ถ้าเราต้องการให้ URL ที่ปรากฏบน browser เป็น new.html ด้วย เราก็เพียงแต่เติม [R] เข้าไปต่อท้ายบรรทัด ดังนี้


 

RewriteRule ^old\.html$ new.html [R]



ซึ่ง [R] ก็คือ ส่วนที่ 4 ที่ผมบอกไว้ข้างบน
4. Command Flag [R] ซึ่งจะเป็นคำสั่งพิเศษกำหนดเงื่อนไขไว้ มีหลายคำสั่งซึ่งจะบอกไว้ตอนท้าย


การใช้ Regular Expressions
จะบอกว่า เป็นส่วนสำคัญที่สุดในการทำ Rewrite และมันก็ทำความความเข้าใจได้ยากพอควร ไม่ต้องห่วงครับ เดี๋ยวผมจะอธิบายเป็นขั้นตอน และยกตัวอย่างประกอบไปเรื่อยๆนะครับ

ตัวอย่างแรก


 

RewriteRule ^products/([0-9][0-9])/$ productinfo.php?prodID=$1


จะเปลี่ยนจาก

productinfo.php?prodID=11 หรือ productinfo.php?prodID=99


ให้เป็น

products/11/ หรือ products/99/



ดูที่ Pattern จะมีส่วนของที่อยู่ในปีกกาเหลี่ยม [ ]  เราเรียกว่า ranges
ในตัวอย่างจะเป็น [0-9] ซึ่งจะใช้ตรวจสอบว่าเป็นตัวอักษรที่อยู่ในช่วง 0-9 ใดๆ
เราสามารถตรวจสอบ ranges อื่นได้ เช่น [A-Z] ตรวจสอบว่าเป็นตัวอักษรตัวใหญ่ตั้งแต่ A-Z
[a-z] ก็เป็นการตรวสอบตัวเล็ก, ถ้า [A-Za-z] ก็ตรวจสอบว่าเป็นทั้งตัวใหญ่และตัวเล็ก เป็นต้น

และใน Pattern ก็จะมีส่วนที่อยู่ในวงเล็บ ( ) เป็นการเก็บค่าที่เราตรวจสอบพบ และตรงตามเงื่อนไข ซึ่งเราสามารถเอาค่านี้ ส่งไปให้ PHP ในส่วนของ Query String ได้ เราเรียกค่าที่ได้จากวงเล็บนี่ว่า back-reference
เราสามารถตรวจสอบและแยก back-reference ออกได้หลายๆอันใน URL อันเดียว (ดูตัวอย่างต่อๆไป) ซึ่ง back-reference ในวงเล็บแรก เวลาเราอ้างถึงเราก็จะใช้ $1 ส่วนลำดับต่อๆไป ก็จะเป็น $2, $3 ไปเรื่อยๆ

ดังนั้นผู้เยี่ยมชมเว็บ(หรือ bot ก็ได้)ก็จะเห็น url เป็น products/11/ หรือ products/99/ ซึ่ง สั้นและกระชับ โดยหารู้ไม่ว่า เราได้ซ่อน URL ที่ไม่ค่อยสวยงามและอ่านยากไว้เบื้องหลัง


ใส่ / ต่อท้าย
บางครั้งผู้เยี่ยมชมเว็บ อาจจะพิมพ์ URL แค่  products/12 ซึ่งเมื่อเข้าไปตรวจสอบใน Pattern ด้านบน ก็จะไม่ตรง เพราะ Pattern ด้านบนจะต้องมี / ต่อท้ายด้วย มันจึงไม่ทำ transparently redirect ให้เรา
เราก็มีวิธีแก้เหตุการณ์แบบนี้ ซึ่งเราก็จะเขียน Rule ใหม่เพิ่มเข้าไปดังนี้

RewriteRule ^products/([0-9][0-9])$ products/$1/ [R]
RewriteRule ^products/([0-9][0-9])/$ productinfo.php?prodID=$1


ดังนั้น เมื่อ Server ตรวจเจอ products/12 ก็จะเปลี่ยน URL เป็น products/12/ และแสดง URL ให้บน Browser ด้วย เพราะเราใส่ [R] ไว้ด้วย เมื่อเจอเงื่อนไขบรรทัดที่ 2 ก็เลยไม่มีปัญหาใดๆ ซึ่งมันก็จะส่งเป็น  transparently redirect ไปที่ productinfo.php?prodID=12 ตามความต้องการของเรา


การใช้ Match Quantifiers
จะเป็นว่าตัวอย่างข้างบน เรากำหนดเป็น ^products/([0-9][0-9])$ นั่นหมายความว่า ตัวเลขที่ตามหลัง  products/xx ต้องมี 2 ตัวเท่านั้น ซึ่งก็จะเป็นไปได้สูงสุดแค่ 99 แล้วกรณี productinfo.php?prodID=100 ล่ะจะทำอย่างไร?
ในกรณีนี้ เราสามารถใช้ Quantifiers เป็นตัวกำหนดได้ (Quantifiers มีหลายตัว จะอธิบายต่อไปเรื่อยๆ) ดังตัวอย่าง

RewriteRule ^products/([0-9]+)$ products/$1/ [R]


เครื่องหมายบวก + แทนอักษรตั้งแต่ 1 ตัว ถึง n ตัว (ตั้งแต่ 1 ตัวขึ้นไป) ดังนั้น [0-9]+ ก็หมายความว่า เป็นตัวเลข 0-9 ตั้งแต่ 1 หลักขึ้นไป ถ้าเราใส่ products/1 หรือ products/1000 ก็สามารถ Match case นี้ได้แล้วครับ


 

ข้อมูลเพิ่มเติมของ  Rewrite Rule

RewriteRule


Regular expressions

Some hints about the syntax of regular expressions:

Text:
  . Any single character
  [chars] One  of chars
  [^chars] None of chars
  text1|text2 text1 or text2

Quantifiers:
  ? 0 or 1 of the preceding text
  * 0 or N of the preceding text (N > 0)
  + 1 or N of the preceding text (N > 1)

Grouping:
  (text) Grouping of text

Anchors:
  ^ Start of line anchor
  $ End of line anchor

Escaping:
  \ char escape that particular char


Pattern Matching metacharacter Definitions
\     Use before any of the following characters to escape or null the meaning or it. \* \. \$ \+ \[ \]
^    Start matching at this point
$    End point of the match
.    Any character
[]    Starts a range
|    Starts alternative match this|that would mean match this or that
()    starts a back reference point
?    match 0 or 1 time Quantifier
+    match atleast 1 or more times Quantifier
*    match 0 to infinite times Quantifier
{}    match minimum to maximum Quantifier {0,3} match up to 3 times


Range Definitions []
^     Negates the class. [^A-Z]+ means don't match any uppercases
\    Use before any of the following characters to escape or null the meaning or it. [\+]+
-    Range for matching [0-9]+ [a-zA-Z]+


Command Flag
[R]     Redirect you can add an =301 or =302 to change the type.
[F]    Forces the url to be forbidden. 403 header
[G]    Forces the url to be gone 401 header
[L]    Last rule. (You should use this on all your rules that don't link together)
[N]    Next round. Rerun the rules again from the start
[C]    Chains a rewrite rule together with the next rule.
[T]    use T=MIME-type to force the file to be a mime type
[NS]    Use if no sub request is requested
[NC]    Makes the rule case INsensitive
[QSA]    Query String Append use to add to an existing query string
[NE]    Turns of normal escapes that are default in the rewriterule
[PT]    Pass through to the handler (together with mod alias)
   Skip the next rule S=3 skips the next 3 rules
[E]    E=var sets an enviromental variable that can be called by other rules


[ ความเห็นที่ 9]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันพุธ 9 พฤษภาคม 2555  01:16 น.
ปัญหาเมื่อเรา rewrite ใหม่แล้ว พวกรูปทั้งหลายที่เราใส่ไว้ว่า "img/pic01.jpg" มันไม่ออก

แก้ได้ด้วยการเรียกแบบ full url ครับ

[ ความเห็นที่ 10]
RE : การทำ url ภาษาไทย ด้วย mod rewrite
โพสต์เมื่อ: วันพุธ 9 พฤษภาคม 2555  01:27 น.
เขียน Mod rewrite แล้วมีปัญหาCSS เพี้ยน รูปไม่แสดง

วิธีแก้
ให้ใส่ ตำแหน่ง css เป็น url  เต็มๆ

เช่น
<link href='http://www.mysite.com/style/css.css' rel='stylesheet' type='text/css' />



คุณต้องสมัครสมาชิก ถึงจะโพสกระทู้ได้

ปิดรับสมัครสมาชิกแล้ว


คำยอดฮิต :- mod rewrite