【发布时间】:2014-01-29 14:50:30
【问题描述】:
我只是想知道是否有人知道是否有一种方法可以在不使用 Artisan 的情况下在 laravel 网站上激活维护模式?我没有对服务器的命令行访问权限,因此如果不先在本地站点上更新它,然后将更改推送到服务器,我就无法使用 Artisan。是否有我可以添加的主路由拒绝访问任何其他路由?
谢谢!
【问题讨论】:
标签: laravel laravel-4 laravel-5
我只是想知道是否有人知道是否有一种方法可以在不使用 Artisan 的情况下在 laravel 网站上激活维护模式?我没有对服务器的命令行访问权限,因此如果不先在本地站点上更新它,然后将更改推送到服务器,我就无法使用 Artisan。是否有我可以添加的主路由拒绝访问任何其他路由?
谢谢!
【问题讨论】:
标签: laravel laravel-4 laravel-5
Laravel 5
下载文件位于storage/framework/down - 谢谢@ruuter。
它需要用 JSON 填充:
{"time": UNIXTS, "message": "", "retry": ""}
不确定该消息在哪里使用,但如果您需要自定义维护页面的消息,请根据需要创建resources/views/errors/503.blade.php。
Laravel 4.1 及以下版本
查看 Artisan 的 DownCommand 类,它似乎在 app/storage/meta 文件夹中创建了一个新文件。
这是DownCommand fire 方法。
public function fire()
{
touch($this->laravel['path.storage'].'/meta/down');
$this->comment('Application is now in maintenance mode.');
}
以及对应的UpCommandfire方法。
public function fire()
{
@unlink($this->laravel['path.storage'].'/meta/down');
$this->info('Application is now live.');
}
这些文件位于vendor/laravel/framework/src/Illuminate/Foundation/Console。
它专门在app/storage/meta 中创建了一个名为down 的文件。
您可以创建一个授权的路由/控制器操作来复制这些命令。
请注意下面 Sjaak Trekhaa 的评论,这就是我现在使用的方法!
【讨论】:
您可以从您的应用程序中调用 artisan:
Artisan::call('down');
Artisan::call('up');
但是由于您的应用已关闭,因此您将无法启动它。您可以自己创建功能:
关闭路由,用户必须经过身份验证才能执行此操作:
Route::group(array('before' => 'auth'), function()
{
Route::get('shut/the/application/down', function()
{
touch(storage_path().'/meta/my.down');
});
});
恢复它的途径:
Route::get('bring/the/application/back/up', function()
{
@unlink(storage_path().'/meta/my.down');
});
一个检查它是否启动的过滤器:
Route::filter('applicationIsUp', function()
{
if (file_exists($this['path.storage'].'/meta/my.down'))
{
return Redirect::to('site/is/down');
}
});
恢复它的途径:
Route::get('bring/the/application/back/up', function()
{
@unlink(storage_path().'/meta/my.down');
});
当您的网站关闭时显示漂亮视图的路线
Route::get('site/is/down', function()
{
return View::make('views.site.down');
});
【讨论】:
return Response::view('views.site.down', array(), 503);
只是想把它发布给网络上的每个人,php artisan down 所做的只是在app/storage/meta 目录中触摸(创建)一个名为“down”的空文件。如果此文件存在,则应用程序处于维护模式。这就是它的全部内容:
// From vendor\laravel\framework\src\Illuminate\Foundation\Application.php
public function isDownForMaintenance()
{
return file_exists($this['config']['app.manifest'].'/down');
}
所以如果你可以上传文件,你需要做的就是上传一个名为'down'的空文件到app/storage/meta。
下位于storage/framework/down
谢谢鲁特。
【讨论】:
上述问题的真正正确答案由安东尼奥提供。
您可以从您的应用程序中调用 artisan:
Artisan::call('down'); Artisan::call('up');
由于 Laravel 5 中引入了中间件,我将介绍如何在 Laravel 5.3 应用程序中实现它。
首先让我们创建新的中间件$php artisan make:middleware CheckForMaintenanceMode
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Http\Exceptions\MaintenanceModeException;
class CheckForMaintenanceMode
{
protected $app;
public function __construct(Application $app)
{
$this->app = $app;
}
public function handle($request, Closure $next)
{
if ($this->app->isDownForMaintenance() && !$this->isBackendRequest($request)) {
$data = json_decode(file_get_contents($this->app->storagePath() . '/framework/down'), true);
throw new MaintenanceModeException($data['time'], $data['retry'], $data['message']);
}
return $next($request);
}
private function isBackendRequest($request)
{
return ($request->is('admin/*') or $request->is('login'));
}
}
注意:函数
isBackendRequest()返回true或false如果我们在管理员 prefix (true) 或尝试登录 (@ 987654328@) 或任何其他 (false)
打开App/Http/Kernel.php 并用我们的新中间件重写基础中间件
protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
];
如果应用程序处于维护模式(关闭),我们仍然可以访问登录页面或任何admin/* 页面。
Route::group(['middleware' => 'auth', 'prefix' => 'admin'], function () {
//admin routes
});
【讨论】:
在 laravel 5.6 中,“down”文件的位置略有移动。
它的新位置是:
./storage/framework/down
Laravel 5.6 在“down”文件中添加了一些内容,虽然空文件仍然有效。默认情况下,您会看到“503 服务不可用”页面。
完成后只需删除“down”文件即可。
【讨论】: