我见过很多基于php的网站,无论你在哪里导航你的index.php,一些随机参数都会在网址中传递。当我看一个做同样的开源版本时,index.php中有一堆包含在其中
我能做同样事情的基本方法是什么?这包括mod重写吗?
感谢
答案 0 :(得分:6)
我已经看过这个,我个人认为这是一个糟糕的设计。特别是因为许多人不倾向于清理include参数,以便有人可以通过传递相对路径来包含他们想要的任何文件。
mod_rewrite通常用于隐藏以下网址:
/index.php?path=user&include=account
将其替换为:
/user/account
像这样:
RewriteEngine On
RewriteBase /
RewriteRule ^(\w+)/(\w+)$ /index.php?path=$1&include=$2 [L]
我通常也会这样说:
RewriteRule %{THE_REQUEST} \.php$ [R=404,L]
我忘记了确切的语法,但基本上是eidea是用户无法直接请求php文件。它必须通过另一个RewriteRule(就像第一个)来完成,这可以通过清理查询字符串输入来节省很多麻烦,并避免PHP为你从未想过的事情创建全局变量的整个问题(尽管他们仍然可以为此)。
无论如何,回到为什么我认为这是一个可怕的想法。他们这样做是因为他们倾向于在每个页面中都需要一些公共代码(比如页眉和页脚)。我认为你最好只在你的每个页面的顶部包含一个公共文件。这是一个更简单,更清晰的设计。
答案 1 :(得分:2)
这是非常常见的设计模式,而不仅仅是PHP - 我首先将它用于Cold Fusion,其设计模型名为Fusebox,但所有脚本语言都存在类似的想法。
基本上,索引页面根据参数中传递的内容组装显示的HTML。例如,如果没有传递任何参数,它将知道拉入并显示默认页面,或者如果参数说出“?p = contact”之类的信息,则显示联系页面。
mod-rewrite理念以相反的方式工作,通常与模型 - 视图 - 控制器设计模式(MVC)一起使用。例如,网站的联系页面可能包含网址:
www.mysite.com/infopages/contact
和mod重写会将此转换为
www.mysite.com/index.php?p=contact
MVC是一种非常以代码为中心的网站设计方式,适用于较大和/或更复杂的应用程序。对于较小的网站来说,它有点过头了。
答案 2 :(得分:2)
他们直接包括,当然有一些检查,但基本上是这样的:
include("content/".$_GET['something'].".php");
您也可以使用“something”作为数据库关键字,但大多数index.php?somthing =我见过的地方都包括一些健全检查。
答案 3 :(得分:0)
这种方式的工作方式是,应用程序不再被写为页面集合,而是作为整体整体,分为多个文件。换句话说,index.php
是应用程序,它需要参数来控制它向您显示的部分。
有多种方法可以在URL中传递页面信息。使用对实际文件名的引用不应该是您尝试执行此操作的第一种方式。相反,将应用程序划分为不同的命令和子命令。那么index.php
所做的前两件事就是:
第二种是查找某种类型的数据,或者查找数组,或者查找某个类或特定目录中的文件。无论如何,它都需要将其视为不受信任的数据,并在命令无效时生成错误页面或带有错误标题的默认页面。 (如果它将在文件名中使用,请确保它已被适当转换[例如.php
已添加]并检查是否有任何越狱行为[例如,没有任何嵌入式斜杠]。
答案 4 :(得分:0)
您正在查看使用前端控制器构建的网站。
http://en.wikipedia.org/wiki/Front_controller
许多流行的PHP应用程序(如Joomla)使用它来将脚本集合视为一个有凝聚力的应用程序。
前端控制器对于像PHP这样的语言来说是一个好主意,但是记得用mod_rewrite隐藏前端控制器以创建URL标准化并优化可读性。
答案 5 :(得分:0)
此类型的URL允许您使用指定公共标记的单个模板文件,其中包含包含特定文本的片段。包含片段可以是文件系统上的实际文件,也可以是数据库中的CLOB,“page”参数给出主键。
正如其他人所指出的那样,通过一条确切的路径并不安全 - 不要这样做。充其量,它可用于探测您的网站并检索非公开内容。在最坏的情况下,它可以将您的网站变成一个不知情的代理,用于您不希望与您合法关联的内容。在介于两者之间的某个地方,它可能会为黑客提供将新内容物理插入您网站的能力。
更安全的方法是使用数据库表,或(对于较小的站点),使用内存中的页表。这是我用来访问个人网站页面表的代码:
$pageName = (array_key_exists("page", $_GET))
? $_GET["page"]
: null;
$currentPage = (array_key_exists($pageName, $pagetab))
? $pagetab[$pageName]
: $pagetab["home"];