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

And*_*iga 1 php url-routing laravel

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

话虽如此,我将如何创建这样一个既适用于应用程序又易于安全(例如防止本地文件包含)的架构呢?

ter*_*ško 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 );
Run Code Online (Sandbox Code Playgroud)

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

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