Nếu bạn chỉ muốn thay đổi tuyến đường picture.php
thì sau đó thêm quy tắc viết lại .htaccess
sẽ phục vụ nhu cầu của bạn, nhưng, nếu bạn muốn URL viết lại như trong Wordpress thì PHP là cách. Đây là ví dụ đơn giản để bắt đầu.
Cấu trúc thư mục
Có hai tệp cần thiết trong thư mục gốc, .htaccess
và index.php
, sẽ rất tốt nếu đặt phần còn lại của các .php
tệp vào thư mục riêng, như inc/
.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Tập tin này có bốn chỉ thị:
RewriteEngine
- kích hoạt công cụ viết lại
RewriteRule
- từ chối quyền truy cập vào tất cả các tệp trong inc/
thư mục, chuyển hướng bất kỳ cuộc gọi nào đến thư mục đó đếnindex.php
RewriteCond
- cho phép truy cập trực tiếp vào tất cả các tệp khác (như hình ảnh, css hoặc tập lệnh)
RewriteRule
- chuyển hướng bất cứ điều gì khác để index.php
index.php
Bởi vì mọi thứ bây giờ được chuyển hướng đến index.php, sẽ được xác định nếu url là chính xác, tất cả các tham số đều có mặt và nếu loại tham số là chính xác.
Để kiểm tra url chúng ta cần có một bộ quy tắc và công cụ tốt nhất cho đó là biểu thức chính quy. Bằng cách sử dụng các biểu thức thông thường, chúng ta sẽ giết hai con ruồi bằng một đòn. Url, để vượt qua bài kiểm tra này phải có tất cả các tham số bắt buộc được kiểm tra trên các ký tự được phép. Dưới đây là một số ví dụ về các quy tắc.
$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' => "/" // '/'
);
Tiếp theo là chuẩn bị uri yêu cầu.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Bây giờ chúng ta có uri yêu cầu, bước cuối cùng là kiểm tra uri theo các quy tắc biểu thức chính quy.
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 )
*/
}
}
Kết hợp thành công sẽ, vì chúng ta sử dụng các mô hình con có tên trong regex, điền vào $params
mảng gần giống như PHP điền vào $_GET
mảng. Tuy nhiên, khi sử dụng url động, $_GET
mảng được điền mà không có bất kỳ kiểm tra nào về tham số.
/ hình ảnh / một số + văn bản / 51
Mảng
(
[0] => / hình ảnh / một số văn bản / 51
[văn bản] => một số văn bản
[1] => một số văn bản
[id] => 51
[2] => 51
)
ảnh.php? text = some + text & id = 51
Mảng
(
[văn bản] => một số văn bản
[id] => 51
)
Một vài dòng mã và hiểu biết cơ bản về các biểu thức chính quy là đủ để bắt đầu xây dựng một hệ thống định tuyến vững chắc.
Nguồn hoàn chỉnh
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' );