Wenn Sie nur die Route ändern möchten, um picture.php
dann eine Umschreiberegel hinzuzufügen, .htaccess
wird dies Ihren Anforderungen entsprechen. Wenn Sie jedoch möchten, dass die URL wie in Wordpress neu geschrieben wird, ist PHP der richtige Weg. Hier ist zunächst ein einfaches Beispiel.
Ordnerstruktur
Es gibt zwei Dateien, die im Stammordner benötigt werden, .htaccess
und index.php
, und es wäre gut, den Rest der .php
Dateien in einem separaten Ordner zu platzieren, wie z inc/
.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Diese Datei enthält vier Anweisungen:
RewriteEngine
- Aktivieren Sie die Umschreibe-Engine
RewriteRule
- Verweigern Sie den Zugriff auf alle Dateien im inc/
Ordner und leiten Sie jeden Aufruf an diesen Ordner umindex.php
RewriteCond
- Ermöglichen Sie den direkten Zugriff auf alle anderen Dateien (wie Bilder, CSS oder Skripte).
RewriteRule
- alles andere umleiten an index.php
index.php
Da jetzt alles auf index.php umgeleitet wird, wird festgestellt, ob die URL korrekt ist, alle Parameter vorhanden sind und ob die Art der Parameter korrekt ist.
Um die URL zu testen, benötigen wir eine Reihe von Regeln, und das beste Werkzeug dafür ist ein regulärer Ausdruck. Mit regulären Ausdrücken töten wir zwei Fliegen mit einem Schlag. URL, um diesen Test zu bestehen, muss alle erforderlichen Parameter enthalten, die an zulässigen Zeichen getestet werden. Hier sind einige Beispiele für Regeln.
$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' => "/" // '/'
);
Als nächstes bereiten Sie die Anfrage uri vor.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Nachdem wir die Anfrage uri haben, besteht der letzte Schritt darin, uri anhand der Regeln für reguläre Ausdrücke zu testen.
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 )
*/
}
}
Eine erfolgreiche Übereinstimmung füllt das $params
Array fast genauso, wie PHP das $_GET
Array füllt , da wir in Regex benannte Untermuster verwenden . Bei Verwendung einer dynamischen URL wird das $_GET
Array jedoch ohne Überprüfung der Parameter gefüllt.
/ Bild / etwas + Text / 51
Array
((
[0] => / Bild / etwas Text / 51
[text] => etwas Text
[1] => etwas Text
[id] => 51
[2] => 51
)
picture.php? text = some + text & id = 51
Array
((
[text] => etwas Text
[id] => 51
)
Diese wenigen Codezeilen und die Grundkenntnisse der regulären Ausdrücke reichen aus, um ein solides Routing-System aufzubauen.
Vollständige Quelle
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' );