有一個非常好的nginx的模塊做這個。
URL獲取兩個參數 - 我們稱它們爲s(安全)和t(時間戳)。安全是從時間戳,路徑和鹽產生的安全哈希(在你的情況下只需添加IP)。
$ip = $_SERVER['REMOTE_ADDR'];
$salt = 'change me cause im not secure';
$path = '/download/webapp.rar';
$timestamp = time() + 3600; // one hour valid
$hash = md5($salt . $ip . $timestamp . $path); // order isn't important at all... just do the same when verifying
$url = "http://mysite.com{$path}?s={$hash}&t={$timestamp}"; // use this as DL url
驗證:
$ip = $_SERVER['REMOTE_ADDR'];
$salt = 'change me cause im not secure';
$path = $_SERVER['REQUEST_URI'];
$hashGiven = $_GET['s'];
$timestamp = $_GET['t'];
$hash = md5($salt . $ip . $timestamp . $path);
if($hashGiven == $hash && $timestamp <= time()) {
// serve file
} else {
die('link expired or invalid');
}
現在你只需要到下載改寫這個「中間人」 -script和你做。
例改寫爲nginx的:
location /download {
rewrite ^.*$ /download.php last;
break;
}
我真的不familar與Apache重寫,所以你可以檢查這個自己。
如果您使用以下模塊中的一個,你不需要親自驗證,這是更好的性能明智的,但請注意,它可以提供更多的配置,有時另一種方式來生成URL和散列(見模塊docs here)。
,或者你只是使用nginx的安全鏈接模塊:http://wiki.nginx.org/HttpSecureLinkModule
還爲萊蒂掛件:http://redmine.lighttpd.net/wiki/1/Docs:ModSecDownload
或者nginx的安全下載模塊:http://wiki.nginx.org/HttpSecureDownload
也許有一些是阿帕奇太...也許你可以做一些改寫那裏...
「沒有任何數據庫」?這是一個什麼樣的要求?你*絕對*必須存儲一些數據來解決這個問題,並且數據庫是迄今爲止最好的地方*這樣做。你爲什麼試圖避免使用數據庫? – meagar
如果沒有數據庫,可以通過設置'expiry'來使用'cookies'來實現。然而,麻煩的是你可以刪除cookie。所以這不是可靠的方法。 –
@GhazanfarMir ...除了這樣的事實,即餅乾可以很容易欺騙,以至於使它們幾乎沒用這個... – DaveRandom