Jika Anda hanya ingin mengubah rute untuk picture.php
kemudian menambahkan aturan penulisan ulang .htaccess
akan 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, .htaccess
dan index.php
, dan akan lebih baik untuk meletakkan sisa .php
file 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 $params
array hampir sama dengan PHP mengisi $_GET
array. Namun, saat menggunakan url dinamis, $_GET
array 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' );