Laravel 4.2过滤访问上传的文件

时间:2015-07-29 10:57:34

标签: php laravel laravel-4

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

<%@ OutputCache Duration="86400" VaryByParam="None" VaryByCustom="ConferenceID" %>

上面的代码适用于链接Route::get('uploads/{class}/{id}/{filename}', array('before' => 'auth', function() { return "route works"; })); ,但如果链接指向实际文件uploads/Deviation/1/Laravel%20Cheatsheet,则laravel似乎绕过路由器。我明白为什么会这样做,但有没有办法弯曲上传文件夹的规则?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

推荐的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/...', ...);
}));