Jeśli chcesz tylko zmienić trasę, picture.php
to dodanie reguły przepisywania w .htaccess
celu zaspokoi Twoje potrzeby, ale jeśli chcesz przepisać adres URL tak, jak w Wordpress, to PHP jest drogą. Oto prosty przykład na początek.
Struktura folderów
Istnieją dwa pliki, które są potrzebne w folderze głównym, .htaccess
a index.php
, i dobrze byłoby, aby umieścić resztę .php
plików w osobnym folderze, np inc/
.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Ten plik ma cztery dyrektywy:
RewriteEngine
- włącz silnik przepisywania
RewriteRule
- odmów dostępu do wszystkich plików w inc/
folderze, przekieruj każde wywołanie do tego folderu doindex.php
RewriteCond
- zezwalaj na bezpośredni dostęp do wszystkich innych plików (takich jak obrazy, css lub skrypty)
RewriteRule
- przekierować cokolwiek innego do index.php
index.php
Ponieważ wszystko jest teraz przekierowywane do index.php, zostanie ustalone, czy adres URL jest poprawny, wszystkie parametry są obecne i czy typ parametrów jest poprawny.
Aby przetestować adres URL, musimy mieć zestaw reguł, a najlepszym narzędziem do tego jest wyrażenie regularne. Używając wyrażeń regularnych, zabijemy dwie muchy jednym ciosem. Adres URL, aby przejść ten test, musi mieć wszystkie wymagane parametry, które są testowane na dozwolonych znakach. Oto kilka przykładów reguł.
$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' => "/" // '/'
);
Następnie należy przygotować żądanie uri.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Teraz, gdy mamy żądanie uri, ostatnim krokiem jest przetestowanie uri na regułach wyrażeń regularnych.
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 )
*/
}
}
Pomyślne dopasowanie spowoduje, że ponieważ używamy nazwanych wzorców podrzędnych w wyrażeniu regularnym, wypełni $params
tablicę prawie tak samo, jak PHP wypełnia $_GET
tablicę. Jednak w przypadku korzystania z dynamicznego adresu URL $_GET
tablica jest wypełniana bez sprawdzania parametrów.
/ obrazek / jakiś + tekst / 51
Szyk
(
[0] => / obrazek / jakiś tekst / 51
[tekst] => jakiś tekst
[1] => jakiś tekst
[id] => 51
[2] => 51
)
picture.php? text = some + text & id = 51
Szyk
(
[tekst] => jakiś tekst
[id] => 51
)
Tych kilka wierszy kodu i podstawowa znajomość wyrażeń regularnych wystarczy, aby zacząć budować solidny system routingu.
Kompletne źródło
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' );