【问题标题】:Laravel 4.2 filter access to uploaded filesLaravel 4.2 过滤访问上传文件
【发布时间】:2015-07-29 20:36:07
【问题描述】:

我想路由以过滤对upploads文件夹中文件的访问。

Route::get('uploads/{class}/{id}/{filename}', array('before' => 'auth', function()
{
    return "route works";
}));

上面的代码适用于链接uploads/Deviation/1/Laravel%20Cheatsheet,但如果链接是指向实际文件uploads/Deviation/1/Laravel%20Cheatsheet.pdf,似乎laravel 正在绕过路由器。我明白为什么会这样做,但是有没有办法改变上传文件夹的规则?

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    默认情况下,参数值中不允许使用斜线和点等字符。为了覆盖它,您需要按如下方式定义路由:

    Route::get('uploads/{class}/{id}/{filename}', array('before' => 'auth', function()
    {
      return "route works";
    }))->where('filename', '[a-zA-Z0-9\.]+');
    

    请确保您没有将文件存储在可公开访问的位置 - 我建议将其存储在 storage/ 中的某个位置。

    【讨论】:

    • 这并不能真正解决更根本的问题 - 如果该 URL 上存在真实文件,Laravel 将根本不会参与请求。网络服务器将直接提供文件。
    • 对于你在 laravel 中定义的所有路由都是如此,不仅是这一条,因此需要将所有必要的路由正确重定向到 Laravel
    【解决方案2】:

    推荐的 Laravel Apache 配置是:

    Options +FollowSymLinks
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    

    推荐的nginx配置是:

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    

    这两个都优先考虑具有该确切文件名的任何文件,如果找不到文件,则回退到 Laravel 的 index.php 。这是相当重要的——你不希望大型 PHP 框架参与提供静态文件(如 CSS/JS/图像),这会给服务器带来沉重的负担。

    如果你想把 Laravel 放在你上传的文件前面,只需使用不同的 URL 来引用它们,然后在你完成任何你需要做的事情后让 Laravel 提供文件。

    Route::get('not-the-real-uploads/{class}/{id}/{filename}', array('before' => 'auth', function()
    {
        // something like this
        return Response::download('uploads/...', ...);
    }));
    

    【讨论】:

    • 这就是我所做的。我在AttachmentsController 中的show($id) 方法中创建了.htaccess 文件到deny from all 用于上传文件夹和return Response::download...
    猜你喜欢
    • 1970-01-01
    • 2016-08-27
    • 2018-03-20
    • 2017-09-21
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2017-03-25
    • 2011-05-31
    相关资源
    最近更新 更多