我想建立一个具有不同视图的网站,但有一个稳定的页眉和页脚 - 到目前为止没有问题。但是我不喜欢目前使用 php GET 方法获得的那种 url。我的网站目前是这样工作的(什么 istn 工作正常):
$_page = $_GET['p'];
if ($_page == "city-sitemap"){ include "views/city-sitemap-view.php"; }
if ($_page == "place"){ include "views/place-view.php"; }
else { include "views/index-view.php";}
这不是一个非常甜蜜的解决方案,但我现在不知道另一个。我尝试使用 mvc 框架,但失败得很惨。所以每次我添加一个链接时,我都会使用例如这个"index.php?p=place" - 不是很好。包括视图也是不是很聪明吗?有没有更好的方法?我想使用类似重写引擎的东西,新网址就像一个文件夹。你能帮我找到更好的解决方案吗?多谢
页面包括
对于页面包含,您可以使用一个简单的数组将页面动态分配给特定名称。如下:
$pages = array('city-sitemap'=>'views/city-sitemap-view.php',
'place'=>'views/place-view.php',
)
if(array_key_exists($_GET['p'], $pages){
include $pages[$_GET['p']];
}else{
include 'views/error.php';
}
此数组应添加到常规配置文件中。使用此配置,如果要显示城市站点地图视图.php视图,则必须编写以下 url:http://www.domain.com/index.php?p=city-sitemap
网址重写
可以使用 .htaccess 文件重写 URL。下面是您可以在 .htaccess 文件中编写的代码示例。
RewriteEngine On
RewriteRule ^(.*)$ index.php?p=$1 [L,QSA]
如下所示的网址:
http://www.domain.com/index.php?p=city-sitemap
将转换为此一个:
http://www.domain.com/city-sitemap
您应该研究一下称为前端控制器的东西。你可以自己写一个非常简单的。它与 URL 重写结合使用。例如,如果您的网址如下所示: /我的页面.html
URL 重写器会将请求重新路由到索引.php .
索引.php 然后查看 URL 并执行以下操作:
1)将页面分解为字符串,忽略.html扩展
preg_match("'/(.*?)'.html", $_REQUEST['URI'], $matches);
$pageClass = $matches[1];
//$pageClass = "mypage"
2) 查找并加载一个名为"Mypage.php"的类
$controller = new $pageClass();
3) 在页面类上调用 run 方法,向其传递所有请求参数
$request = new Request($_REQUEST);
$controller->run($request);
然后,您可以在特定于页面的控制器类中执行所有特定于页面的内容。
在此过程中,每个简单的步骤中,您都会发现想要做越来越多的事情,例如身份验证,过滤,跟踪等。您最终将开发一个特定于您需求的前端控制器,以及一个基本控制器类,该类执行所有控制器共有的一堆标准内容。
根据我的评论,我真的认为你应该考虑我链接的框架(这是非常合乎逻辑的)或任何其他微框架,但如果你真的想自己做这件事,那么你可以像这样处理你的包含:
<?php //index.php
$requested_page=isset($_GET['p'])?$_GET['p']:'home';
//maybe have this included from pages.php for organization
$pages=array(
'home'=>'home_content.php',
'about'=>'about_content.php',
'contact'=>'contact_content.php'
);
include "views/header.php";
if(array_key_exists($requested_page, $pages)){
include "views/".$pages[$requested_page];
}else{
header('HTTP/1.0 404 Not Found');
include "views/error404.php";
}
include "views/footer.php";
这会将您的页面保留在单个数组中,并防止任意包含漏洞。
有关更好的 URL,请参阅其他用户 .htaccess 重写规则