【发布时间】:2011-03-31 00:48:32
【问题描述】:
如果我有一个位于 http//site.com/files/foo.zip 的文件。
如何将此网址改写为http://site.com/download/foo.zip,以便用户的浏览器/下载管理器中根本不显示真实网址?
【问题讨论】:
标签: php url-rewriting
如果我有一个位于 http//site.com/files/foo.zip 的文件。
如何将此网址改写为http://site.com/download/foo.zip,以便用户的浏览器/下载管理器中根本不显示真实网址?
【问题讨论】:
标签: php url-rewriting
我假设你有 Apache,意思是 .htaccess。
RewriteEngine On
RewriteRule ^download/(.*)$ files/$1 [R,L]
否则,如果您确实想使用 PHP,则无论如何都需要通过 URL 重写将这些请求发送到 PHP 脚本。
我想将下载权限限制为仅限注册用户。
这不会那样做,最好的办法是将这些文件移动到文档根目录上方并通过 PHP 提供它们。
例如...
<?php
// Get into your system's context so we can determine if the user is logged in.
include 'everything.php';
if ( ! $loggedIn) {
die('Log in mate!'); // Handle this somewhat better :)
}
$file = $_GET['file'];
// Get real path for $file.
$file = basename(__FILE__) . '/above/doc/root/files/' . $file;
if ( ! file_exists($file)) {
die('This file does not exist!'); // And handle this better too.
}
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
【讨论】:
[L]。有一种需要隐藏原始 URL 的感觉。 [R] 本质上会通过 HTTP 重定向暴露原始 URL。
dirname(ABSPATH).'/dir/'.$_GET['file'] 作为文件路径。所以现在有了一个不错的 URL 而不是 download.php 我只需要重写脚本路径
对于中型文件,我也更喜欢下载脚本。设置起来更容易。
但是您仍然可以使用 RewriteRule 方法进行一些作弊。这需要您从 PHP 创建临时授权文件:
if ($user_is_authenticated) {
touch("tmp/auth-{$_SERVER['REMOTE_ADDR']}");
}
那么你就可以用这个简单的规则保护real下载文件夹了:
RewriteCond ../tmp/auth-%{REMOTE_ADDR} !-f
RewriteRule .+\.zip /denied.html
这种方法会产生一些管理开销。 - 您需要不时清理这些授权状态文件(cronjob)。此外,使用 IP 地址也不是最佳方法。会话 cookie 也可以,但更多涉及:Best strategy to protect downloadable files -php/mysql Apache2 server
【讨论】: