30

我只是想知道是否有人知道是否有一种方法可以在不使用 Artisan 的情况下在 laravel 网站上激活维护模式?我没有对服务器的命令行访问权限,因此如果不先在本地站点上更新它,然后将更改推送到服务器,我就无法使用 Artisan。是否有可能我可以添加的主路由将拒绝访问任何其他路由?

谢谢!

4

5 回答 5

55

您可以从您的应用程序中调用工匠:

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');
});
于 2014-01-10T15:14:45.893 回答
15

拉拉维尔 5

Downfile 在storage/framework/down- 谢谢@ruuter。它需要用 JSON 填充:

{"time": UNIXTS, "message": "", "retry": ""}

不确定此消息在哪里使用,但如果您需要自定义维护页面的消息,请根据需要创建resources/views/errors/503.blade.php

Laravel 4.1 及以下

看看DownCommandArtisan 的类,它似乎在app/storage/meta文件夹中创建了一个新文件。

方法如下DownCommand fire

public function fire()
{
    touch($this->laravel['path.storage'].'/meta/down');

    $this->comment('Application is now in maintenance mode.');
}

以及相应的UpCommand fire方法。

public function fire()
{
    @unlink($this->laravel['path.storage'].'/meta/down');

    $this->info('Application is now live.');
}

这些文件位于vendor/laravel/framework/src/Illuminate/Foundation/Console.

它专门创建一个名为downin的文件app/storage/meta

您可以创建授权的路由/控制器操作来复制这些命令。

请注意下面 Sjaak Trekhaa 的评论,这就是我现在要使用的方法,因为我已经被提醒了!

于 2014-01-10T15:08:54.597 回答
8

拉拉维尔 4

只是想为网络上的每个人提供这个,所有的只是在名为“down”php artisan down的目录中触摸(创建)一个空文件。app/storage/meta如果此文件存在,则应用程序处于维护模式。这里的所有都是它的:

// From vendor\laravel\framework\src\Illuminate\Foundation\Application.php

public function isDownForMaintenance()
{
    return file_exists($this['config']['app.manifest'].'/down');
}

因此,如果您可以上传文件,您所需要做的就是将名为“down”的空文件上传到app/storage/meta.


拉拉维尔 5:

羽绒位于storage/framework/down

谢谢鲁特。

于 2015-03-23T13:29:28.033 回答
7

问题的真正正确答案是安东尼奥提供的。

您可以从您的应用程序中调用工匠:

Artisan::call('down');

Artisan::call('up');

拉拉维尔 5+

由于中间件是在 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我们是否在管理员前缀true)或尝试登录(true)或其他任何东西(false

替换全局中间件

使用我们的新中间件打开App/Http/Kernel.php和重写基础中间件

protected $middleware = [
    \App\Http\Middleware\CheckForMaintenanceMode::class,
];

如果应用程序处于维护模式(关闭),我们仍然可以访问登录页面或任何admin/*页面。

Route::group(['middleware' => 'auth', 'prefix' => 'admin'], function () { 
    //admin routes
});  
于 2016-08-08T19:13:40.380 回答
5

在 laravel 5.6 中,“down”文件的位置略有移动。

它的新位置是:

./存储/框架/下

Laravel 5.6 在“down”文件中添加了一些内容,虽然空文件仍然有效。默认情况下,您会看到“503 服务不可用”页面。

完成后只需删除“down”文件。

于 2018-08-08T22:35:10.710 回答