Jika Anda hanya ingin mengubah rute untuk picture.phpkemudian menambahkan aturan penulisan ulang .htaccessakan melayani kebutuhan Anda, tetapi, jika Anda ingin URL menulis ulang seperti di Wordpress maka PHP adalah caranya. Ini adalah contoh sederhana untuk memulai.
Struktur folder
Ada dua file yang diperlukan di folder root, .htaccessdan index.php, dan akan lebih baik untuk meletakkan sisa .phpfile di folder terpisah, seperti inc/.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
File ini memiliki empat arahan:
RewriteEngine - aktifkan mesin penulisan ulang
RewriteRule- menolak akses ke semua file dalam inc/folder, mengalihkan semua panggilan ke folder itu keindex.php
RewriteCond - memungkinkan akses langsung ke semua file lain (seperti gambar, css atau skrip)
RewriteRule - redirect apa pun ke index.php
index.php
Karena semuanya sekarang dialihkan ke index.php, akan ditentukan apakah urlnya benar, semua parameter ada, dan jika jenis parameternya benar.
Untuk menguji url kita perlu memiliki seperangkat aturan, dan alat terbaik untuk itu adalah ekspresi reguler. Dengan menggunakan ekspresi reguler, kami akan membunuh dua lalat dengan satu pukulan. Url, untuk lulus tes ini harus memiliki semua parameter yang diperlukan yang diuji pada karakter yang diizinkan. Berikut ini beberapa contoh aturan.
$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' => "/" // '/'
);
Selanjutnya adalah menyiapkan permintaan uri.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Sekarang setelah kami memiliki permintaan uri, langkah terakhir adalah menguji uri pada aturan ekspresi reguler.
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 )
*/
}
}
Pertandingan yang berhasil akan, karena kami menggunakan subpatterns bernama di regex, mengisi $paramsarray hampir sama dengan PHP mengisi $_GETarray. Namun, saat menggunakan url dinamis, $_GETarray diisi tanpa parameter apa pun.
/ picture / some + text / 51
Himpunan
(
[0] => / gambar / beberapa teks / 51
[text] => beberapa teks
[1] => beberapa teks
[id] => 51
[2] => 51
)
picture.php? text = some + text & id = 51
Himpunan
(
[text] => beberapa teks
[id] => 51
)
Beberapa baris kode ini dan pengetahuan dasar tentang ekspresi reguler sudah cukup untuk mulai membangun sistem perutean yang solid.
Sumber lengkap
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' );