PHP链接控制系统


PHP link control system

我有一个关于PHP中"链接控制系统"的问题。这个想法是制作可以创建与原始链接不同的链接的脚本-类似于.htaccess的友好链接。在.htacccess中,制定规则将所有流量重定向到脚本文件-例如linkprocessor.php,然后在这个文件中应该有一些条件,mysql连接和来自数据库的模式抓取器(friendlyurl和originalurl列)。所以,如果我们写完整的地址-example.com/defined-address,它会将我们重定向(但不会更改地址)到linkprocessor.php,然后脚本会检查数据库中是否有/定义的地址,如果是,它将包括某些(基于friendlyurl)originalurl文件。这个脚本是最佳的吗?这个脚本可以防止"黑客"。

示例:

example.com/defined-address->linkprocessor.php->从表WHERE friendlyurl=/定义的地址中选择originalurl->包含originalull

=>可以写得不连贯,但很难准确解释

您在这里询问的是Front Controller模式http://en.wikipedia.org/wiki/Front_controller.

有多种方法可以实现它,使用sql数据库将URI字符串映射到要包含的文件是一种有效的方法,但可能有些过头了。同样的信息可能会硬编码在php数组中。

防止黑客攻击的标准方法是只允许包含白名单文件。在您的情况下,您使用显式映射来确定要包含的页面,因此这不是问题。

一些代码让你开始:

<?php
$map = array('/home' => 'included_1', '/details' => 'included_2' ... )
if (array_key_exists($_SERVER['REQUEST_URI'], $map)) {
    include $map[$_SERVER['REQUEST_URI']]
}
else {
    // Send a 404 response
}

您想要的是前端控制器的设计模式。

您描述了解决此问题的基本方法,即将所有传入请求(减去对静态内容(如图像、CSS文件和JS文件)的请求)重定向到单个文件。通常,此文件是站点根目录中的index.php文件,但也可以是任何文件。

您可以在Apache服务器上使用.htaccess或在IIS服务器上使用web.config来完成此重定向。对于.htaccess,你可以在mod_rewrite上搜索,并获得大量有助于你的信息。

一旦所有请求都指向前端控制器,您就需要确定请求的内容。您可以检查PHP的$_SERVER['REQUEST_URI']来查看请求是什么,并相应地处理它。

我见过的这个问题的最可扩展的解决方案依赖于位于特定位置的控制器(类)和位于单独位置的"静态"文件。这样做会使扩展您的网站将响应的请求变得非常容易:

/** 
   I am assuming at this point that the variable $request is an array 
   representing the current request.  For example, if the request is for: 
   http://www.example.com/dir/page, $request will contain two entries, 
   'dir' and 'page'
 **/
if(file_exists('/controllers/' . $request[0] . '.php')) {
    require_once '/controllers/' . $request[0] . '.php';
    $controller = new $request[0]();
    $controller->dispatch($request);
} else if(file_exists( '/static/'.$request[0] . '.php')) {
    require_once '/static/' . $request[0] . '.php';
} else 
    throw new Exception('404', 404);

上面的伪代码比实际代码多,我不能保证它会真正运行,但想法是存在的。

要在系统中添加另一个控制器,只需编写一个类,确保它有一个dispatch方法,并将其放在适当的位置。