【问题标题】:Laravel - pass GET requests to files through controllerLaravel - 通过控制器将 GET 请求传递给文件
【发布时间】:2018-12-22 23:33:23
【问题描述】:

在我的 laravel 应用程序中,我想在将他/她重定向到实际文件之前验证客户端是否有 cookie。为此,我创建了一个控制器函数来接收我创建的这条新路由:

Route::group(['middleware'=>['web']], function(){
   Route::get('/storage/{filename}', 'HomeController@getArquivo');
}

控制器:

class HomeController extends Controller{

 public function getArquivo($filename)
 {
    if(hasCookie()) Redirect::to('/storage/' . $filename);
    else Redirect::to('/some/other/address');
 }
}

因此,例如,在我的存储中,我有一个名为 8-0.jpeg 的文件,而 getArquivo 函数仅在我传递与它不同的文件名时才会被调用(如 url.com/storage/something)。如果我传递了确切的文件名 url.com/storage/8-0.jpeg),那么它只会返回忽略路线的图像。所以我的问题是,如何强制 GET 请求总是先通过这个控制器?提前致谢。

编辑:我已根据提供的答案进行了更改,但我无法使其正常工作。现在的代码如何:

中间件:

class VerificaCookieArquivo
{
var $nomeBiscoitoSessao = "biscoito";
public function handle($request, Closure $next)
{
    if ($this->temBiscoito()) {
        return $next($request);
    }

    return Redirect::to('/some/other/address');
}

private function temBiscoito(){
    return isset($_COOKIE[$this->nomeBiscoitoSessao]);
}

}

Kernel.php:

protected $routeMiddleware = [
    //other middlewares
    'verificaCookieArquivo' => \Ibbr\Http\Middleware\VerificaCookieArquivo::class,
];

在路由 (web.php) 中,我为此 cookie 检查创建了一个单独的路由组,因为我不希望它影响我拥有的其他路由:

Route::group(['middleware'=>['verificaCookieArquivo']], function()
{
    Route::get('/storage/{filename}', 'HomeController@getArquivo');   

});

在 HomeController.php 中:

public function getArquivo($filename){
    $fullpath = "/storage/" . $filename;
    return response()->download(storage_path($fullpath), null, [], null);
}

还是不能让它工作,行为还是和以前一样

【问题讨论】:

    标签: php laravel http-get laravel-5.6


    【解决方案1】:

    在 Laravel 中创建一个中间件:

    php artisan make:middleware CookieCheck
    

    将此中间件添加到Kernel.php 文件中

    将这些中间件添加到路由中:

    Route::group(['middleware'=>['web','cookie:check']], function(){
       Route::get('/storage/{filename}', 'HomeController@getArquivo');
    }
    

    将 Cookie 检查代码放入中间件。

    【讨论】:

      【解决方案2】:

      创建一个中间件,该中间件将检查具有有效 cookie 的访问者。你可以像这样创建它

      中间件类

      namespace App\Http\Middleware;
      use Closure;
      
      class SecureFile
      {
          public function handle($request, Closure $next)
          {
              if ($this->hasCookie()) {
                  return $next($request);
              }
      
              return redirect('/some/other/address');
          }
      
          private function hasCookie(){
              //check cookie here and return ture or false 
              return true;
          }
      }
      

      现在将这个SecureFile中间件添加到Kernel.php中的routeMiddleware

      protected $routeMiddleware = [
          ...
          ...
          'secureFile' => \App\Http\Middleware\SecureFile::class,
      ];
      

      最后一步使用这个中间件到你的路由

      Route::group(['middleware'=>['web','secureFile']], function(){
         Route::get('/storage/{filename}', 'HomeController@getArquivo');
      }
      

      在控制器中

      class HomeController extends Controller{
      
           public function getArquivo($filename)
           {
              $fullpath = "any_sub_folder/" . $filename;
              return response()->download(storage_path($fullpath), null, [], null);
              //https://laravel.com/docs/5.6/responses#file-downloads
           }
      }
      

      编辑 看来您在public/storage 文件夹中有图像,那么您的图像将直接加载,它不会调用您的路由。尝试将您的图像放在storage 文件夹中并添加不同的路线,像这样

      Route::get('file/{filename}', 'HomeController@getArquivo')->middleware('secureFile');
      

      【讨论】:

      • 那没有用,我还不得不将 route::get 放到这个控制器的另一个中间件组中,web 因为它与我不想的其他路由混淆验证此 cookie
      • 创建一个需要检查cookie的单独路由组。如果这是唯一的,则为其创建单独的路线
      • 仍然无法让它工作,我已经用我写的新代码更新了我的问题
      • 公用文件夹中有存储文件夹吗?如果您在公共文件夹中有存储文件夹,并且其中有所有图像,那么所有这些图像都可以公开访问。保护那些图像是没有用的
      • 你对storage文件夹感到困惑,storage_path返回laravel_root_folder/storage而不是public/storage文件夹。公共文件夹中的任何文件都是公开可用的。最好将您的私人图像(需要 cookie)存储在 laravel_root_folder/storage 文件夹中,然后尝试我的答案它会起作用
      猜你喜欢
      • 2018-10-07
      • 2017-12-27
      • 1970-01-01
      • 2019-07-16
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多