2014-09-25 96 views
0

我使用Laravel-4 在當前項目中,我有一個管理頁面訪問靜態文件

Route::get('/admin', function() { 
    return View::make('admin.admin'); 
})->before('admin.auth'); 

本頁面已經embbed admin.swf文件

<object type="application/x-shockwave-flash" data="/misc/admin/admin.swf"> 
      <param name="wmode" value="window"/> 
      <param name="quality" value="high"/> 
      ... 
</object> 

admin.swf文件位於在/project-root/public/misc/admin/admin.swf

我的管理員路線mysite.com/admin由「admin.auth」過濾器保護。 但是每個人都可以通過URL訪問admin.swf文件mysite.com/misc/admin/admin.swf

保護'admin.auth'過濾器直接訪問靜態管理文件的最佳方式是什麼?

回答

1

我afrait這將是非常困難的,因爲它不是Laravel這是給你訪問特定的文件,但您的Web服務器(Apache時,Nginx的?)。

Laravel創建一個頁面,在該頁面鏈接的文件的所有其他訪問都在此之後完成,作爲對Web服務器的請求,所以如果向nginx請求文件並且該文件存在,它將直接向您的瀏覽器,否則它會將呼叫重定向到你的index.php。

你可以告訴nginx的禁止訪問該文件夾:

location ~ /misc/admin/ { 
    deny all; 
    return 404; 
} 

但你必須創建一個路由和一流服務您的文件:

Route::get('/admin/download/{fileName}', ['as' => 'admin.download', function ($fileName) 
{ 
    return Response::download($fileName); 
}])->before('admin.auth'); 

download方法已經存在於你的Laravel上,所以它沒有經過測試,但它應該按原樣工作。

然後你只需要引用您的文件作爲

<object type="application/x-shockwave-flash" data="{{ URL::route('admin.download', ['admin.swf']) }}"> 
    <param name="wmode" value="window"/> 
    <param name="quality" value="high"/> 
</object> 

注意,這是一個緩慢的操作,因爲Laravel會一次又一次地引導爲每一個文件你的頁面有下載。如果你只有一個文件,它應該沒問題,但是,例如,照片庫,渲染完整頁面需要很長時間。

編輯:

這是下載方法聲明:

public static function download($file, $name = null, array $headers = array(), $disposition = 'attachment') 

因此,如果您需要更改標題,您可以。

+0

Tnanks的答案。我嘗試了這種方法,但是我看到的是白色塊,而不是Flash電影。單擊鼠標右鍵顯示flash player上下文菜單「Movie not loaded」 我想Response :: download會設置錯誤的HTTP標頭。 – terbooter 2014-09-25 19:10:17

+0

經過編輯可顯示放置正確標題的位置。 – 2014-09-25 20:14:01

+0

我解決了它。 :)要設置正確的標題,需要將最後一個參數從'attachment'改爲'inline' – terbooter 2014-09-25 20:40:28

0

1. 我把我的admin.swf文件/project-root/private/admin.swf 我覺得這是比更改Web服務器的配置更好地限制公衆進入。

2. 我提出以下航線

Route::get('/admin.swf', function() { 
    $file = dirname(app_path()) . "/private/admin.swf"; 
    return Response::make(File::get($file), 200, [ 
     'Content-Type' => 'application/x-shockwave-flash' 
    ]); 
})->before('admin.auth'); 

現在文件只能授權後進行訪問。

PS使用響應的另一變型::下載

Route::get('/admin.swf', function() { 
    $file = dirname(app_path()) . "/private/admin.swf"; 
    return Response::download($file, '', [], 'inline'); 
})->before('static.auth');