หากคุณต้องการเปลี่ยนเส้นทางสำหรับpicture.php
การเพิ่มกฎการเขียนซ้ำใน.htaccess
นั้นจะตอบสนองความต้องการของคุณ แต่ถ้าคุณต้องการให้การเขียน URL ใหม่เหมือนใน Wordpress PHP ก็เป็นวิธีที่ดี นี่คือตัวอย่างง่ายๆที่จะเริ่มต้นด้วย
โครงสร้างโฟลเดอร์
มีไฟล์สองไฟล์ที่จำเป็นในโฟลเดอร์รูท.htaccess
และindex.php
และควรวางไฟล์ที่เหลือ.php
ในโฟลเดอร์แยกเช่นinc/
กัน
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
ไฟล์นี้มีสี่คำสั่ง:
RewriteEngine
- เปิดใช้งานเอ็นจิ้นเขียนใหม่
RewriteRule
- ปฏิเสธการเข้าถึงไฟล์ทั้งหมดในinc/
โฟลเดอร์เปลี่ยนเส้นทางการโทรไปยังโฟลเดอร์นั้นเพื่อindex.php
RewriteCond
- อนุญาตการเข้าถึงโดยตรงไปยังไฟล์อื่น ๆ (เช่นรูปภาพ css หรือสคริปต์)
RewriteRule
- เปลี่ยนเส้นทางสิ่งอื่นไปที่ index.php
index.php
เนื่องจากขณะนี้ทุกอย่างถูกเปลี่ยนเส้นทางไปยัง index.php จะมีการพิจารณาว่า URL นั้นถูกต้องพารามิเตอร์ทั้งหมดมีอยู่และหากประเภทของพารามิเตอร์นั้นถูกต้อง
ในการทดสอบ URL เราต้องมีชุดของกฎและเครื่องมือที่ดีที่สุดสำหรับสิ่งนั้นคือการแสดงออกปกติ โดยการใช้นิพจน์ทั่วไปเราจะฆ่าแมลงวันสองตัวด้วยการเป่าเพียงครั้งเดียว URL ที่จะผ่านการทดสอบนี้จะต้องมีพารามิเตอร์ที่จำเป็นทั้งหมดที่มีการทดสอบกับตัวละครที่ได้รับอนุญาต นี่คือตัวอย่างของกฎ
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
ถัดไปคือการเตรียมคำขอ uri
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
ตอนนี้เรามีคำขอ uri แล้วขั้นตอนสุดท้ายคือทดสอบ uri เกี่ยวกับกฎการแสดงออกปกติ
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
}
}
การจับคู่ที่ประสบความสำเร็จจะเกิดขึ้นเนื่องจากเราใช้รูปแบบย่อยที่มีชื่อใน regex ให้เติม$params
อาร์เรย์เกือบจะเหมือนกับ PHP เติม$_GET
อาร์เรย์ อย่างไรก็ตามเมื่อใช้ URL แบบไดนามิก$_GET
อาร์เรย์จะถูกเติมโดยไม่มีการตรวจสอบพารามิเตอร์ใด ๆ
/ ภาพ / บาง + ข้อความ / 51
แถว
(
[0] => / picture / some text / 51
[text] => ข้อความบางส่วน
[1] => ข้อความบางส่วน
[id] => 51
[2] => 51
)
picture.php? text = ข้อความ + บาง & id = 51
แถว
(
[text] => ข้อความบางส่วน
[id] => 51
)
โค้ดสองสามบรรทัดเหล่านี้และการรู้พื้นฐานของนิพจน์ทั่วไปเพียงพอที่จะเริ่มสร้างระบบเส้นทางที่มั่นคง
แหล่งข้อมูลที่สมบูรณ์
define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' );
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
include( INCLUDE_DIR . $action . '.php' );
// exit to avoid the 404 message
exit();
}
}
// nothing is found so handle the 404 error
include( INCLUDE_DIR . '404.php' );