2013-08-24 25 views
1

儘管我努力尋找關於如何爲使用PHP構建的Web應用程序設置安全的單一入口點體系結構的教程,但我一直無法找到一個好的教程。誰知道,也許我的搜索查詢不好... 看着Laravel的代碼似乎是一個好主意,但它是讓您的頭部旋轉的好方法。這裏有太多的東西讓我理解。如何設置一個類似於Laravel的單入口點體系結構?

這就是說,我將如何去創建這樣一種既簡單適用於應用程序又能夠同時保護(例如,防範本地文件包含)的體系結構?

+0

您正在尋找一個'Front Controller',它至少能夠完成您想要的操作。 – Yang

回答

5

首先,您需要將所有請求重定向到一個PHP文件。你在.htaccess在Apache上做的那部分或它在其他服務器上的對應部分。

然後,您需要了解您可以在$_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')具體使用參數的命令。

如果你自己並沒有搞亂模式,那麼你提取的值將是安全的,以防止未經授權的文件包含。

相關問題