Якщо ви хочете змінити маршрут для подальшого 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 = 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 )
*/
}
}
Успішна відповідність, оскільки ми використовуємо названі підпрограми в регулярному виразі, заповнимо $params
масив майже так само, як PHP заповнює $_GET
масив. Однак при використанні динамічного URL-адреси $_GET
масив заповнюється без будь-яких перевірок параметрів.
/ малюнок / деякі + текст / 51
Масив
(
[0] => / зображення / деякий текст / 51
[текст] => деякий текст
[1] => деякий текст
[id] => 51
[2] => 51
)
picture.php? text = деякий + текст & id = 51
Масив
(
[текст] => деякий текст
[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' );