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