Php 包括带有$\u GET的页面
我想要像index.php?showuser=512,index.php?shownews=317这样的url,用于我从db获取内容的页面。。。对于常规页面index.php?page=about等,无需修改重写 Invision电源板的URL如下所示。我看过他们的代码,但我不知道他们是怎么做到的 我可以这样做:Php 包括带有$\u GET的页面,php,Php,我想要像index.php?showuser=512,index.php?shownews=317这样的url,用于我从db获取内容的页面。。。对于常规页面index.php?page=about等,无需修改重写 Invision电源板的URL如下所示。我看过他们的代码,但我不知道他们是怎么做到的 我可以这样做: if (ctype_digit($_GET['shownews'])) include('shownews.php'); elseif (ctype_digit($_GET['sho
if (ctype_digit($_GET['shownews'])) include('shownews.php');
elseif (ctype_digit($_GET['showuser'])) include('showuser.php');
// regular pages
elseif ($_GET['page'] == 'about') include('about.php');
elseif ($_GET['page'] == 'help') include('help.php');
elseif ($_GET['page'] == 'login') include('login.php');
但这感觉太乱了。
只是好奇IPB是如何做到这一点的。有没有更好的办法?没有任何修改。有人知道吗?我怀疑他们会像上面那样做
我做不到:
if (preg_match('/^[a-z0-9]+$/', $_GET['page'])) include('$_GET['page']');
然后我会得到像index.php?showuser&id=512这样的链接,这是我不喜欢的。(我知道仅仅展示Princi是不安全的)
我喜欢这种方式,这不是最好的,但我喜欢它,所以请安静的模板引擎,框架等只是善良的回答我的问题。。。我只是想知道IPB是如何做到这一点的
谢谢
托梅克我不知道IPB是如何做到这一点的,让我们把它放在一边。但是,我会这样处理这个问题: 首先,我认识到有两种GET参数:page/identifier和just page。这些将分别进行测试 第二,我认识到所有get参数都与它们的文件名匹配,没有php后缀,因此我们可以利用这一点 要记住的最重要的事情之一是永远不要让GET参数影响未初始化的代码。在这种情况下,我们知道可以显示哪些类型的页面,并且希望显示哪些类型的页面,因此我们可以从中创建一个白名单 因此,在伪y调度程序代码上:
$pagesWithId = array("shownews", "showuser", "showwhatever");
$justPages = array("about", "help", "login");
foreach ($pagesWithId as $page) {
if (isset($_GET[$page])) {
$id = (int)$_GET[$page];
include($page.'.php');
die();
}
}
if (in_array($_GET['page'], $justPages)) {
include($_GET['page'].'.php');
die();
}
// page not found
show404OrHandleOtherwise();
对于页面,您只需使用一个简单的数组
if (isset($pages[$_GET['page']])) include $pages[$_GET['page']];
对于shownews=317,您可以在应用程序中进行简单转换。根据您希望对页面或shownews等进行优先级排序的方式:
if (isset($pages[$_GET['page']])) {
include $pages[$_GET['page']];
} else {
$possiblePages = array_filter(array_intersect_key($_GET, $pagesWithId), 'ctype_digit');
if (!empty($possiblePages)) {
$id = reset($possiblePages);
$pageName = key($possiblePages);
$page = $pagesWithId[$pageName];
include $page;
} else {
//no valid pages
}
}
注意:页面“名称”是数组键,值是要包含的路径、文件和扩展名。更加可定制。非常感谢!好多了