【问题标题】:Laravel prevent database access for a specific routeLaravel 阻止对特定路由的数据库访问
【发布时间】:2014-10-27 04:39:02
【问题描述】:

我的负载均衡器使用路由/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 时,我得到以下响应(没有 cookie,耶!):

< 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 中的数据库密码更改为不正确的密码。我的希望是,因为路由根本没有访问数据库,所以它不应该关心密码是否不正确。错误的!路线失败。更糟糕的是,堆栈跟踪表明连接是由于与会话相关的代码路径而启动的。

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

【问题讨论】:

  • 不知道能不能完全去掉数据库交互。老实说,如果你不是从这个实例为应用程序提供服务,那么像 Laravel 这样的全栈框架可能是错误的工具。
  • @rich97 我们将数据库用于 99% 的其他路线,而 Laravel 是一个不错的选择。我们需要这条特定的路线是独立于数据库的,这样数据库问题就不会破坏我们的 php 服务器。

标签: php session laravel laravel-4


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢@rich97!我现在倾向于纯 Apache。欣赏它。
  • 很高兴我能帮上忙。您介意将其标记为已回答,以便我可以得到那些甜蜜、甜蜜的虚构互联网积分吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2022-07-12
相关资源
最近更新 更多