Laravel阻止特定路由的数据库访问

时间:2014-09-02 20:02:25

标签: php session laravel laravel-4

我的负载均衡器使用了一条路由/status来确定我的实例是否已启动并正在运行。我需要通过laravel(而不是apache)来控制它,因此我可以利用artisan down/up命令手动控制实例运行状况。

我今天遇到了一个我的数据库拒绝连接的事件(一个无关的问题)。不幸的是,这导致/status路由失败,因为它连接到数据库(用于会话)。我添加了一个过滤器来使用数组会话驱动程序,希望它会停止访问数据库,但由于某种原因,它仍然会访问数据库。

这是我使用过滤器的路线。这一切都很简单:

Route::filter('disablesessions', function() {
  Config::set('session.driver', 'array');
});
Route::get('/status', ['before' => 'disablesessions', function() {
  return 'ok';
}]);

当我curl -v http://localhost/status时,我得到以下回复(没有cookies,是的!):

< HTTP/1.1 200 OK
< Date: Tue, 02 Sep 2014 19:48:45 GMT
* Server Apache/2.4.7 (Ubuntu) is not blacklisted
< Server: Apache/2.4.7 (Ubuntu)
< X-Powered-By: PHP/5.5.9-1ubuntu4.3
< Cache-Control: no-cache
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8

作为测试,我将config/database.php中的数据库密码更改为错误。我希望因为路由根本没有访问数据库,所以不应该关心密码是不正确的。错误!路线失败了。更糟糕的是,堆栈跟踪表明由于与会话相关的代码路径而启动了连接。

Stack Trace

这对我来说似乎很奇怪。我的第一个预感是,在disablesessions过滤器运行之前,框架中存在与会话相关的代码路径,导致连接发生。过滤器随后运行并影响响应(无cookie)。我真的很感激一些帮助:)

1 个答案:

答案 0 :(得分:2)

我可能是错的。可能有一种方法可以完全禁用路由的数据库访问,但查看堆栈跟踪,似乎连接已在代码中深入建立,而我的Google搜索没有返回任何内容。

您也可以切换连接以使用SQLite,您不需要服务器来运行SQLite,因为它存储为文件系统上的文件。因此,设置一个SQL配置并确保它是可写的,并用以下内容替换过滤器:

Config::set('database.default', 'sqlite');

另一种方法是使用重写规则,让Apache / Nginx处理该路由。完全绕过Laravel,并将其指向您选择的剧本。这也有一个小优势,即如果您的应用程序出现问题,那么状态脚本不受影响。