เนื่องด้วย ปีใหม่ + ผมมาอยู่ที่นี้นานแล้ว.. ได้อะไรไปก็เยอะ ก็อยากจะตอบแทนบ้าง!
แต่พลังวัตร SEO ก็ยังไม่ถึง ก็ขออนุญาติเอาความสามารถ Programming มาตอบแทนเพื่อนๆ นะครับ

วิธีนี้ไม่ใช่ Pure Rewrite นะครับ ลองอ่านดูน่าจะเข้าใจว่าทำไมผมพูดอย่างนั้น
ผลลัพท์ที่น่าจะได้
example.com/board/1-บอร์ดทดสอบ.html
example.com/topic/2-กระทู้ทดสอบ.html
ผมจับมือทำเลยนะครับ แค่ 2 อย่างก่อน (เหนื่อย)
ลองอ่าน.. ค่อยๆ ทำความเข้าใจนะครับ ประยุกต์ได้เยอะ
มีปัญหา + คำถามก็ลงไว้นะครับ ผมขอตัวไปเรียนก่อน

ปล. น้องผมเอาไปลงว่าใช้ได้นะครับ
-------
Update!- ผมแก้ที่ไฟล์ MessageIndex.php -> โดยการใส่
str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim(
-ตัวแปร- ))
จุดประสงค์ก็คือ เปลี่ยนอักษร #,+,?,% และช่องว่าง ให้เป็น - ไปซะ เวลาผ่านลิ้งจะได้ไม่มีปัญหา
ทดสอบแล้วว่าใช้ได้ในระดับนึงนะครับ (ไม่กล้ายืนยัน 100% เพราะผมทดสอบคนเดียว)

-------
ผมใช้ Appserv 2.5.2 นะครับ เป็นตัวอย่าง
root dir: C:\AppServ\www\Lab\SMF
เอาละครับ เริ่มจาก SMF 1.1.11 เพิ่งลดสดๆ หมาดๆ เลยครับ^^"
ผมโมภาษาอังกฤษนี้แหละนะครับ
ไม่ต่างกันเราจะลองทำทีละขั้นนะครับ ลองกัดสดๆ ขั้นตอนไหนไม่ได้ก็แก้ปัญหาไป
ขั้นแรก! ออกแบบ URL ครับ!
ในตัวอย่างผมจะใช้แบบนี้ครับ
bbslab/board/1-General-Discuzz.html <--- ใช้เวลาเลือกเว็บบอร์ด
bbslab/topic/123453-สวัสดีชาวโลก.html <--- ใช้เวลาเลือกกระทู้ครับ
ขั้นที่สอง! มั่ว
.htaccess ทำ Mod_Rewrite ครับ
เพิ่มไฟล์
.htaccess ไว้ที่ root โฟลเดอร์
ในที่นี้ก็คือ ->
C:\AppServ\www\Lab\SMF\.htaccessผมลองเขียนเนื้อหาไปว่า
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^board/(\d+)-.+\.html index.php?board=$1 [L]
RewriteRule ^topic/(.+?)-.+\.html index.php?topic=$1 [L]
</IfModule>
ลองมั่ว
regexp เอานะครับ ผมพูดตรงๆ อีกแล้วว่า ผมมั่วมาคร้าบบบบ (เทพๆ อย่าแอบยิ้มนะครับผมอาย)
เรามาลอง url โดยการพิมพ์เข้าไปที่ address bar ครับ แบบในรูปเลยครับ


ปรากฏว่าหน้าเข้าบอร์ดเปลี่ยนไปตามที่คำนวณมาอย่างเนิ่นนาน หึๆ (แล้วตะกี้ใครมันว่ามั่ว(วะ))
ลอง url ของหน้ากระทู้บ้างครับ


เข้ามาได้ครับ! เป็นอันว่าการออกแบบ url ผ่านครับ!!
(ในส่วนการออกแบบ url ท่านเอาไปประยุกต์ต่อได้เองตามสบายเลยครับ ต้องฝึกแก้ mod_rewrite แค่นั้นเอง)
*Note: บางท่านอาจจะสังเกตุเห็นแล้วว่า คีย์จริงๆ ของการ mod_rewrite แบบนี้ก็คือเลขที่อยู่ข้างหน้ากระทู้เองครับ! (กับต้องลงท้ายด้วย .html)
ไอตรงส่วนข้อความ ไม่ได้เอามาคิดอะไรเลย! เป็น
คำพูดหลอกๆ ให้รู้ว่าลิ้งนั่นเกี่ยวกับอะไรเฉยๆ ตัวประมวลผลจริงๆ คือเลขครับ
bbslab/board/1-General-Discuzz.html หากท่านเปลี่ยนเป็น bbslab/board/1-อ็อด-อ็อด.html ก็ยังคงเข้าได้ครับ (เลข 1 เหมือนเดิม ลงด้วย .html เหมือนเดิม)
ต่อเนื่องนะครับ
ขั้นตอนที่ 3!ขั้นตอนที่เหลืออยู่มีเพียงแค่ว่า เราจะต้องแก้ลิ้งที่แสดงในเว็บบอร์ด จากเดิมที่เป็น
?board=xx, ?topic=xx
ให้เป็นในฟอแมทของเรา
ก่อนอื่นเราต้องไปเคลียร์ url หน้าแรกของบอร์ดก่อนครับ! ให้เราเปิด
Sources/QueryString.php (ในที่นี้จะอยู่ตำแหน่ง C
:\AppServ\www\Lab\SMF\Sources\QueryString.php)
ค้นหา ->
$scripturl = $boardurl . '/index.php';
แล้วแก้ไขเป็น ->
$scripturl = $boardurl . '/';
ต่อมาเริ่มจากหน้าแรกบอร์ดครับ ต้องแก้ที่ไฟล์
Sources/BoardIndex.php (ในที่นี้จะอยู่ตำแหน่ง
C:\AppServ\www\Lab\SMF\Sources\BoardIndex.php)
ค้นหา ->
$this_category[$row_board['ID_BOARD']] = array(
ค้นมาเรื่อยๆ จะเจอ
'href' => $scripturl . '?board=' . $row_board['ID_BOARD'] . '.0',
'link' => '<a href="' . $scripturl . '?board=' . $row_board['ID_BOARD'] . '.0">' . $row_board['boardName'] . '</a>'
ก็ให้แก้ไขเป็น
'href' => $scripturl . 'board/' . $row_board['ID_BOARD'] . '-' . $row_board['boardName'] . '.html',
'link' => '<a href="' . $scripturl . 'board/' . $row_board['ID_BOARD'] . '-' . $row_board['boardName'] . '.html">' . $row_board['boardName'] . '</a>'
ต่อมา ค้นหา ->
$this_category[$row_board['ID_PARENT']]['children'][$row_board['ID_BOARD']] = array(
จะเจอเหมือนข้างบนเลยครับ แล้วก็แก้ด้วยวิธีเดียวกัน
มีขอระวังเล็กน้อยก็คือว่า ท่านต้องสังเกตุนะครับว่า 'link' ที่ท่านกำลังแก้ มันเป็นของ
Board หรือ
Topic หรือ
User!
แล้วดูยังไง ?
'href' => $scripturl . '?board=' . $row_board['ID_BOARD'] . '.0',
<--- ของบอร์ดชัดเลยครับ (?board=)
ในส่วนนี้ให้ท่านแก้แค่บอร์ดก่อนครับ ตามวิธีการด้านบน อย่าเพิ่งเก่งแก้ topic ด้วยครับ
พอแก้หมดแล้วลองรีเฟรชบอร์ด แล้วทดสอบดูครับ ดังรูป


พบว่า url เปลี่ยนไปแล้ว ก็ลองคลิกๆ ดูครับ เข้าได้จริงไหม!
ขั้นตอนนี้ เอาให้เคลียก่อนนะครับ !!
ต่อมาเราจะแก้ของ Topic ครับ โดยยังยึดที่ไฟล์เดิมครับ
BoardIndex.phpคราวนี้ค้นหา ->
?topic=
จะเจอ
$this_last_post['href'] = $scripturl . '?topic=' . $row_board['ID_TOPIC'] . '.msg' . ($user_info['is_guest'] ? $modSettings['maxMsgID'] : $row_board['new_from']) . (empty($row_board['isRead']) ? ';boardseen' : '') . '#new';
ก็แก้เป็น
$this_last_post['href'] = $scripturl . 'topic/' . $row_board['ID_TOPIC'] . '.msg' . ($user_info['is_guest'] ? $modSettings['maxMsgID'] : $row_board['new_from']) . (empty($row_board['isRead']) ? ';boardseen' : '') . '-'.$row_board['short_subject'].'.html#new';
ผมเปลี่ยน
?topic=
เป็น
topic/
แล้วก็เติม
'-'.$row_board['short_subject'].'.html#new';
เพื่อสร้าง title ต่อท้ายเลข 1 แล้วก็ปิดด้วย .html ตามสูตร
ค้นต่อไปคับ จะเจอ
$this_event['href'] = $this_event['topic'] == 0 ? '' : $scripturl . '?topic=' . $this_event['topic'] . '.0';
อันนี้ไม่สนใจครับ เป็นส่วยย่อยใน Calendar (ท่านจะทำก็ได้ แต่ผมไม่ทำคับ ขี้เกียจ -> เหตุผลง่ายไหมครับ)
หมดแล้วครับ สำหรับหน้าแรก ลองเปิดบอร์ดมาเลยครับ ลองกดๆ ดูว่าติดอะไรไหม ถ้าไม่ติดเราจะเข้าไปแก้อีกหน้านึงครับ (วิธีนี้แก้แค่ 2 หน้าก็พอครับ!)
--- หน้าแรกมันแค่เด็กๆ ครับ อีกหน้านึงอ้วกแน่!
คราวนี้มาแก้ที่ไฟล์
MessageIndex.php (ในที่นี้อยู่ที่
C:\AppServ\www\Lab\SMF\Sources\MessageIndex.php)
เราจะทำ Board ก่อนเหมือนเดิมนะครับ ค้นหา ->
?board=
(อันที่ผมไม่พูดถึง ผมไม่ทำนะครับ เราหวังผลเสียวอย่างเดียว ไม่ได้หวังเอาบอร์ดเทพ)
จนกว่าจะเจอ
'href' => $scripturl . '?board=' . $row_board['ID_BOARD'] . '.0',
'link' => '<a href="' . $scripturl . '?board=' . $row_board['ID_BOARD'] . '.0">' . $row_board['name'] . '</a>'
แก้ไขเป็น
'href' => $scripturl . 'board/' . $row_board['ID_BOARD'] . '-' . $row_board['name'] . '.html',
'link' => '<a href="' . $scripturl . 'board/' . $row_board['ID_BOARD'] . '-' . $row_board['name'] . '.html">' . $row_board['name'] . '</a>'
เจอ
'href' => $scripturl . '?board=' . $row['ID_BOARD'] . '.0',
'link' => '<a href="' . $scripturl . '?board=' . $row['ID_BOARD'] . '.0">' . $row['name'] . '</a>'
แก้ไขเป็น
'href' => $scripturl . 'board/' . $row['ID_BOARD'] . '-' . $row['name'] . '.html',
'link' => '<a href="' . $scripturl . 'board/' . $row['ID_BOARD'] . '-' . $row['name'] . '.html">' . $row['name'] . '</a>'
เจอ
$context['boards'][$row['ID_PARENT']]['link_children'][] = '<a href="' . $scripturl . '?board=' . $row['ID_BOARD'] . '.0">' . $row['name'] . '</a>';
แก้ไขเป็น
$context['boards'][$row['ID_PARENT']]['link_children'][] = '<a href="' . $scripturl . 'board/' . $row['ID_BOARD'] . '-'.$row['name'].'.html">' . $row['name'] . '</a>';
ที่แก้มาข้างบนจะใช้ในกรณีเป็น Child Board นะครับ - ช่างมันเถอะ
*****ต่อมาค้นหา ->
?topic=
จนกว่าจะเจอ
'href' => $row_board['subject'] != '' ? $scripturl . '?topic=' . $row_board['ID_TOPIC'] . '.new' . (empty($row_board['isRead']) ? ';boardseen' : '') . '#new' : '',
'link' => $row_board['subject'] != '' ? '<a href="' . $scripturl . '?topic=' . $row_board['ID_TOPIC'] . '.new' . (empty($row_board['isRead']) ? ';boardseen' : '') . '#new" title="' . $row_board['subject'] . '">' . $short_subject . '</a>' : $txt[470]
แก้ไขเป็น
'href' => $row_board['subject'] != '' ? $scripturl . 'topic/' . $row_board['ID_TOPIC'] . '.new' . (empty($row_board['isRead']) ? ';boardseen' : '') . '-'.str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim($short_subject)).'#new' : '',
'link' => $row_board['subject'] != '' ? '<a href="' . $scripturl . 'topic/' . $row_board['ID_TOPIC'] . '.new' . (empty($row_board['isRead']) ? ';boardseen' : '') . '-'.str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim($short_subject)).'#new" title="' . $row_board['subject'] . '">' . $short_subject . '</a>' : $txt[470]
ค้นต่อไป จะเจอ
'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.new' . (empty($row['isRead']) ? ';boardseen' : '') . '#new'
แก้ไขเป็น
'href' => $scripturl . 'topic/' . $row['ID_TOPIC'] . '.new' . (empty($row['isRead']) ? ';boardseen' : '') . '-'.str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim($short_subject)).'.html#new'
ยังต่อเนื่อง
$tmppages[] = '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.' . $tmpb . '">' . $tmpa . '</a>';
แก้เป็น
$tmppages[] = '<a href="' . $scripturl . 'topic/' . $row['ID_TOPIC'] . '.' . $tmpb . '-'.str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim($tmpa)).'.html">' . $tmpa . '</a>';
ค้นต่อปายยย
'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.0',
'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.0">' . $row['firstSubject'] . '</a>'
แก้เป็น * (ตอนผมลองทำ หลังจากแก้ตรงนี้ url ก็ใช้ได้เลย -> การแก้ที่ผ่านๆ มาใช้ใน child board)
'href' => $scripturl . 'topic/' . $row['ID_TOPIC'] . '-' . str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim($row['firstSubject'])) . '.html',
'link' => '<a href="' . $scripturl . 'topic/' . $row['ID_TOPIC'] . '-' . str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim($row['firstSubject'])) . '.html">' . $row['firstSubject'] . '</a>'
ค้นอีก * (อันนี้เป็นแก้ลิ้ง "ข้อความสุดท้าย")
'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . ($row['numReplies'] == 0 ? '.0' : '.msg' . $row['ID_LAST_MSG']) . '#new',
'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . ($row['numReplies'] == 0 ? '.0' : '.msg' . $row['ID_LAST_MSG']) . '#new">' . $row['lastSubject'] . '</a>'
แก้ไขเป็น
'href' => $scripturl . 'topic/' . $row['ID_TOPIC'] . ($row['numReplies'] == 0 ? '.0' : '.msg' . $row['ID_LAST_MSG']) . '-'.str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim($row['lastSubject'])).'.html#new',
'link' => '<a href="' . $scripturl . 'topic/' . $row['ID_TOPIC'] . ($row['numReplies'] == 0 ? '.0' : '.msg' . $row['ID_LAST_MSG']) . '-'.str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim($row['lastSubject'])).'.html#new">' . $row['lastSubject'] . '</a>'
ถึงจะใช้ได้แล้ว แต่ก็ยังค้นหาต่อไป (เผื่อมันไปติดกรณีไหนสักแห่ง -> อยากรู้ท่านต้องอ่าน Comment ครับ -> ผมขี้เกียจแปล -> ง่ายไหมครับ)
'new_href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['new_from'] . '#new',
แก้ไขเป็น
'new_href' => $scripturl . 'topic/' . $row['ID_TOPIC'] . '.msg' . $row['new_from'] . '-'.str_replace(array(' ', '#', '+', '?', '%'), array('-', '-', '-', '-', '-'), trim($row['firstSubject'])).'#new',
เป็นอันว่าเสร็จนะครับ!! อันที่จริงจะพบว่าแก้ไม่ยากเลยถ้าทำ .htaccess ออกมาได้แล้วก็อยู่ที่ขั้นตอนการแก้ไขธีมเท่านั้น
ว่าจะให้มันแสดงลิ้งยังไง ซึ้งส่วนนี้ลองแก้ดูเองได้ครับ! ดู Syntax ไม่ให้ Error แล้วก็ลองรีเฟรชดูเอาเลย ว่า url เป็นไปตามที่เราต้องการไหม!!
แค่นี้ก็ใช้ได้ในระดับหนึ่ง ผมขอทิ้งทวนไว้ให้ลองทำนะครับ
- แก้ "linktree" ให้แสดง url เป็น mod_rewrite
- แก้ subject ของ reply message เป็น subject หลักของ topic นั้นๆ
- ประยุกต์ใช้กับการแสดงรายละเอียด user ต่างๆ
ลองแก้ดูครับไม่ยาก ^^"
--
ขอลง Original Post ไว้หน่อยนะครับ ผมละกลัวจริงๆ ว่ามันจะกลายเป็นผมมาลอกข้อความจากไทยเสียว (ก็บอทแรงซะ

)
Original Post:
http://www.lastwordz.net/blog/SMF-Simple-Mod-Rewrite.htm 