我只是想创建一个动态路由系统或类似的东西。
这是我到目前为止所做的,
这是我的.htaccess
文件,用于提供到index.php的所有路由。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]
我的index.php
文件。
<?php
//get request url
$url = rawurldecode($_SERVER['REQUEST_URI']);
//match the request url with above urls.
//do i have to match the above URL with these each urls??
$array = array(
'category' => array('hello','category1','category2'),
'page' => array('page1','page2','page3'),
);
//here i am using array, but the URL can also come from database.
$flag = 0;
foreach($array as $key=>$arr)
{
foreach($arr as $ar)
{
if(preg_match('/'.$ar.'/', $url) && $key == 'category'){
include('category.php');
$flag =1;
exit;
}
elseif (preg_match('/'.$ar.'/', $url) && $key == 'page') {
include('page.php');
$flag =1;
exit;
}
}
}
if($flag ==0)
{
include('404.php');
}
在这里,我要做的是,如果我的路线匹配,我会将控件发送到单独的文件中,这将生成HTML或一些代码。
我在这里面临的问题是我是否必须将每个请求URL与保存的URL进行匹配,否则会有其他解决方案,因为如果有人在数据库或数组中有大约10,000个URL,相比较而言,
如果我做错了方法,请提供解决方案或纠正我。
答案 0 :(得分:0)
通常,这种系统使用$_GET
。因此,您将拥有一个名为modules
的文件夹,其中将拥有所有页面。
所以
modules -> index -> index.php
modules -> home -> home.php
modules -> sign-in -> sign-in.php
modules -> sign-out -> sign-out.php
modules -> 404 -> 404.php
然后您的链接分别如下所示:
<a href="?action=sign-out">Sign Out</a>
然后,您捕获每个请求中的$_GET['action']
并使用is_dir
和或file_exists
检查模块目录,以查看$_GET['action']
中的所述模块是否存在(如果存在)然后可以加载它,否则可以加载要显示的404或模块来代替错误页面。
这样做可以省去在数组中定义所有页面的麻烦。