如何在用户直接关注某个文件时重定向用户?

时间:2017-08-31 15:38:40

标签: php .htaccess

我的网站使用php和htaccess。

基本上,我有一个文件(example.com/music.mp3),我不希望任何人直接访问它,除非它们来自特定页面(example.com/music.php)。

此外,如果他们尝试直接访问它,我希望它将它们重定向到页面。

有没有办法做到这一点?任何帮助将不胜感激。

  

为清楚起见:

     

案例1:用户从外部论坛点击mp3文件的链接,然后将其重定向到php文件。

     

案例2:用户从相应的页面点击mp3文件的链接,然后他们可以自由下载/收听。

3 个答案:

答案 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,如果客户端发送了这封信息,或者客户端几乎可以读取系统中的任何文件。