如何设置类似于Laravel的单一入口点架构?

时间:2013-08-24 06:25:43

标签: php laravel url-routing

尽管我努力寻找如何为使用PHP构建的Web应用程序建立安全的单一入口点架构的教程,但我还是找不到一个好的教程。谁知道,也许我的搜索查询很糟糕...... 看看Laravel的代码似乎是一个好主意,但这是一个让你的头脑旋转的好方法。那里有太多让我理解的东西。

话虽这么说,我将如何创建这样一种既能简单地应用于应用程序又能同时保护安全(例如防止本地文件包含)的架构呢?

1 个答案:

答案 0 :(得分:6)

首先,您需要将所有请求重定向到单个PHP文件。您在Apache上的 .htaccess 或其他服务器上的对应部分执行该部分。

然后,您需要浏览$_SERVER中可以看到的数据。使用$_SERVER['PATH_INFO']是很常见的,但选择取决于您重写请求的准确程度。

然后你需要创建一个路由器,它有一个正则表达式列表,然后尝试匹配你已经获得的URL片段。

以下几个例子可能会给你一些想法:

  • '#^/(?P<page>[^/\\\\.,;?\n]+)$#'
  • '#^/user/(?P<id>[0-9]+)/(?P<nickname>[^/\.,;?\n]+)$#'
  • '#^(?:/test/(?P<parameter>[^/\\\\.,;?\n]+))?/mandatory$#'

通常的做法是通过更简单的符号生成这些正则表达式,但是对于第一次迭代,你不应该过分关注它。

此外,如果您使用具有可选片段的表达式,则还应提供“后备”值。如果未提供片段,但这些值将用作默认值,但匹配模式。

我这样做的方式在PHP中看起来像这样:

/*
 * Routing mechanism
 */

$uri = isset( $_SERVER[ 'PATH_INFO' ] )
            ? $_SERVER[ 'PATH_INFO' ]
            : '/';

$builder = new RequestBuilder;
$request = $builder->create();
$request->setUri( $uri );

$router = new Router( new RouteBuilder );
$router->import(
    $reader->getAsArray( __DIR__ . '/config/routes.json' )
);

$router->route( $request );

在此之后,$request变量包含一个对象,然后您可以使用$id = $request->getParameter('id')$controller = $request->getParameter('controller')等命令查询特定参数。

如果您没有弄乱模式本身,那么您提取的值将是安全的,以防止未经授权的文件包含。