Sadece rotayı değiştirmek için rotayı değiştirmek istiyorsanız, picture.php
yeniden yazma kuralı eklemek .htaccess
ihtiyaçlarınızı karşılayacaktır, ancak URL'nin Wordpress'teki gibi yeniden yazılmasını istiyorsanız, PHP yoludur. Başlamak için basit bir örnek.
Klasör yapısı
Orada kök klasöründe ihtiyaç vardır iki dosyalardır, .htaccess
ve index.php
, ve geri kalan kısmını yerleştirin iyi olurdu .php
gibi ayrı klasördeki dosyaların inc/
.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Bu dosyanın dört yönergesi vardır:
RewriteEngine
- yeniden yazma motorunu etkinleştir
RewriteRule
- inc/
klasördeki tüm dosyalara erişimi reddet , herhangi bir çağrıyı bu klasöre yönlendirindex.php
RewriteCond
- diğer tüm dosyalara (resimler, css veya komut dosyaları gibi) doğrudan erişime izin ver
RewriteRule
- başka bir şeyi yönlendirin index.php
index.php
Artık her şey index.php'ye yönlendirildiğinden, url'nin doğru olup olmadığı, tüm parametrelerin mevcut olup olmadığı ve parametrelerin türü doğru olup olmadığı belirlenecektir.
URL'yi test etmek için bir dizi kuralımız olmalı ve bunun için en iyi araç düzenli bir ifadedir. Düzenli ifadeler kullanarak iki sinek tek bir darbe ile öldüreceğiz. Url, bu testi geçmek için izin verilen karakterlerde test edilen tüm gerekli parametrelere sahip olmalıdır. İşte bazı kural örnekleri.
$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' => "/" // '/'
);
Sonra uri isteğini hazırlamaktır.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Şimdi uri isteğine sahip olduğumuza göre, son adım uri'yi normal ifade kuralları üzerinde test etmektir.
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 )
*/
}
}
Regex'te adlandırılmış alt kalıplar kullandığımızdan, $params
diziyi PHP'nin diziyi doldurmasıyla neredeyse aynı şekilde dolduracağımızdan başarılı bir eşleşme olacaktır $_GET
. Bununla birlikte, dinamik bir url kullanıldığında, $_GET
dizi parametreler kontrol edilmeden doldurulur.
/ Resim / bazı + metin / 51
Dizi
(
[0] => / resim / bazı metinler / 51
[text] => bazı metinler
[1] => bazı metinler
[id] => 51
[2] => 51
)
picture.php? metni bazı + metin & id = = 51
Dizi
(
[text] => bazı metinler
[id] => 51
)
Bu birkaç kod satırı ve düzenli ifadeleri temel olarak bilmek, sağlam bir yönlendirme sistemi oluşturmaya başlamak için yeterlidir.
Komple kaynak
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' );