我的网站使用php和htaccess。
基本上,我有一个文件(example.com/music.mp3),我不希望任何人直接访问它,除非它们来自特定页面(example.com/music.php)。
此外,如果他们尝试直接访问它,我希望它将它们重定向到页面。
有没有办法做到这一点?任何帮助将不胜感激。
为清楚起见:
案例1:用户从外部论坛点击mp3文件的链接,然后将其重定向到php文件。
案例2:用户从相应的页面点击mp3文件的链接,然后他们可以自由下载/收听。
答案 0 :(得分:1)
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example.com/.*$ [NC]
RewriteRule ^music.mp3$ http://www.example.com/music.php [R,L]
如果您想允许空白引用,请先添加此规则:
RewriteCond %{HTTP_REFERER} !^$
答案 1 :(得分:0)
您可以使用<if>
和<else>
指令来实现这一目标。
<if "%{HTTP_REFERER} == 'example.com'">
RewriteRule ^(.*)$ http://example.com/music.mp3 [R=301,NC,L]
</if>
<else>
RewriteRule ^(.*)$ http://example.com/music.php [R=301,NC,L]
</else>
因此,如果引荐来源等于example.com,则重定向到/music.mp3
- 如果没有,则重定向到/music.php
。
确保在>>测试之前清除缓存。
答案 2 :(得分:0)
如果让music.php
阅读music.mp3
并将其归还,该怎么办?信任HTTP_REFERER不是防错的。有些人会有空白的引用,一旦有人发现您使用HTTP_REFERER允许下载,单词将会传播,您的用户将开始使用假标题。
这样的事情:
<?php
$filename = 'music.mp3';
if (isset($_SESSION['auth'])) {
// user is authenticated
header('Content-type: audio/mpeg');
header('Content-length: ' . filesize($filename))
readfile($filename);
} else {
header('Location: login.php');
}
?>
我有一个系统,人们必须登录才能下载一些pdf报告。他们收到一个指向php文件的链接。 PHP文件确定用户是否已登录,如果是,则发送内容类型为application/pdf
并使用readfile
将文件发送给用户。
只要让非常肯定来清理$filename
,如果客户端发送了这封信息,或者客户端几乎可以读取系统中的任何文件。