ルートを変更するだけの場合picture.php
は、書き換えルールを追加.htaccess
することでニーズに対応できますが、WordpressのようにURLを書き換えたい場合は、PHPが適しています。以下は、簡単な例です。
フォルダー構造
そこルートフォルダに必要な2つのファイルがあり、.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]
このファイルには4つのディレクティブがあります。
RewriteEngine
-書き換えエンジンを有効にする
RewriteRule
- inc/
フォルダ内のすべてのファイルへのアクセスを拒否し、そのフォルダへの呼び出しをリダイレクトしますindex.php
RewriteCond
-他のすべてのファイル(画像、CSS、スクリプトなど)への直接アクセスを許可する
RewriteRule
-他に何かをリダイレクトする index.php
index.php
これですべてがindex.phpにリダイレクトされるため、URLが正しいかどうか、すべてのパラメーターが存在するかどうか、パラメーターのタイプが正しいかどうかが判断されます。
URLをテストするには、一連のルールが必要です。そのための最適なツールは正規表現です。正規表現を使用して、1回の打撃で2つのハエを殺します。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
アレイ
(
[0] => / picture / some text / 51
[テキスト] =>いくつかのテキスト
[1] =>テキスト
[ID] => 51
[2] => 51
)
picture.php?text = some + text&id = 51
アレイ
(
[テキスト] =>いくつかのテキスト
[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' );