Se vuoi solo cambiare il percorso per l' picture.php
aggiunta di una regola di riscrittura .htaccess
soddisfarai le tue esigenze, ma, se vuoi riscrivere l'URL come in Wordpress, PHP è la soluzione. Ecco un semplice esempio per cominciare.
Struttura delle cartelle
Ci sono due file che sono necessari nella cartella principale .htaccess
e index.php
, e sarebbe bene posizionare il resto dei .php
file in una cartella separata, come inc/
.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Questo file ha quattro direttive:
RewriteEngine
- abilita il motore di riscrittura
RewriteRule
- nega l'accesso a tutti i file in inc/
cartella, reindirizzare qualsiasi chiamata a quella cartellaindex.php
RewriteCond
- consentire l'accesso diretto a tutti gli altri file (come immagini, CSS o script)
RewriteRule
- reindirizzare qualsiasi altra cosa a index.php
index.php
Poiché ora tutto viene reindirizzato a index.php, verrà determinato se l'URL è corretto, tutti i parametri sono presenti e se il tipo di parametri è corretto.
Per testare l'URL dobbiamo avere un insieme di regole e lo strumento migliore per farlo è un'espressione regolare. Usando espressioni regolari uccideremo due mosche con un colpo. Url, per superare questo test devono avere tutti i parametri richiesti che vengono testati su caratteri consentiti. Ecco alcuni esempi di regole.
$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' => "/" // '/'
);
Il prossimo è preparare l'uri richiesta.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Ora che abbiamo la richiesta uri, il passo finale è testare uri sulle regole delle espressioni regolari.
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 )
*/
}
}
Una partita di successo, dato che utilizziamo repatterns nominati in regex, riempie l' $params
array quasi allo stesso modo in cui PHP riempie l' $_GET
array. Tuttavia, quando si utilizza un URL dinamico, l' $_GET
array viene popolato senza alcun controllo dei parametri.
/ Immagine / un po '+ text / 51
Vettore
(
[0] => / immagine / del testo / 51
[testo] => del testo
[1] => del testo
[id] => 51
[2] => 51
)
picture.php? text = alcuni + testo & id = 51
Vettore
(
[testo] => del testo
[id] => 51
)
Queste poche righe di codice e una conoscenza di base delle espressioni regolari sono sufficienti per iniziare a costruire un solido sistema di routing.
Fonte completa
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' );