【问题标题】:Use Laravel route to access storage subfolders使用 Laravel 路由访问存储子文件夹
【发布时间】:2017-08-09 04:58:57
【问题描述】:

我受到post 的启发,可以安全地访问我存储中的文件。

帖子建议使用以下路线:

Route::get('file/{filename}', 'FileController@getFile')->where('filename', '^[^/]+$');

所以我可以访问任何文件,例如http://yoursite.com/file/secret.jpg

问题如果{filename} 包含subfolder + filename 怎么办? 该网址看起来像http://yoursite.com/file/personal/secret.jpg。 找不到路线。

我也可能有很多级别的子文件夹。

可能的解决方案 作为临时解决方案,我想用http://yoursite.com/file/personal|secret.jpg 替换http://yoursite.com/file/personal/secret.jpg,所以{filename} 将等于personal|secret.jpg。在 getFile 方法中,我会将| 替换为/。但它看起来像一个丑陋的解决方案

有没有更好的解决方案?

【问题讨论】:

  • 唯一阻止它在子文件夹中加载图像的是最后的 where() 语句。如果您删除它,您将能够从子文件夹加载图像,但这可能会带来安全风险。
  • 不!,我刚刚尝试在路线尽头不使用where。我得到(1/1) NotFoundHttpException in RouteCollection.php,这意味着找不到路线。这是有道理的。因为没有路由有/file/{param1}/{param2}/file/personal/{filename}
  • 是的,不知道我在想什么……
  • 你可以完全打开 where() 正则表达式......->where('filename', '.+')

标签: php laravel routes


【解决方案1】:

您可以做的是为该路由参数定义一个模式。

在路由文件的顶部添加:

Route::pattern('filename', '[a-zA-Z0-9.\-_\/]+');

此外,您需要删除路由的 where 子句:

Route::get('file/{filename}', 'FileController@getFile');

希望这会有所帮助!

【讨论】:

  • 有效!但是正则表达式[a-z0-9.\/]+ 是否意味着您只允许字母数字字符?因为我也可能有包含_ 或其他常规授权字符的文件作为文件名的一部分。
【解决方案2】:

你甚至可以在 where 条件中尝试正则表达式。

类似的东西。

Route::get('file/{filename}', function ($filename) {
    dd($filename);
})->where('filename', '^(.+)\/([^\/]+)$');

经过测试并使用 file/filename.jpg 或 file/files/files/filename.jpg 等。

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 2021-11-19
    • 2017-06-20
    • 2015-10-19
    • 2018-12-13
    • 1970-01-01
    • 2015-08-15
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多