拒绝访问文件夹中的文件 - 允许从一个文件进行访问

时间:2015-04-30 16:46:05

标签: .htaccess

我有一个文件夹,/歌曲。此文件夹中的所有文件都应无法访问。这应该很容易做到。

但我想要一个文件,player.php可以访问它们。我怎么能这样做?

我想.htaccess是要走的路。

1 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点,你可以从互联网上完全无法访问文件,或者你可以查看引用者(原文如此)。

HTTP Referer是一个请求头字段,有时包含在请求Web服务器引用请求的位置。例如,页面index.html可以包含图片<img src="/foo.png">。当浏览器加载index.html并看到图像时,它还会加载图像。对该图像的请求将包括http://example.com/index.html作为引用者之前该页面是指浏览器加载图像的内容。引用的问题是(像大多数HTTP请求标头一样)它可以很容易伪造。这意味着,想要下载所有歌曲的人可以假装引用者说它来自player.php。这可能是最容易实现的:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !/player\.php
RewriteCond $1 !player\.php
RewriteRule ^songs/(.*)$ - [L,F]

这些规则将放在文档根目录中的htaccess文件中。或者,如果要将其放在songs文件夹中,请删除规则正则表达式的songs/部分。

第一种解决方案是最好的,因为它使文件无法访问,除非通过您的设计脚本。所以像(我们称之为load.php):

<?php

// make whatever checks here to ensure it's ok to send the file to the browser

$name = $_GET['name'];
$fp = fopen($name, 'rb');

// Change the header to whatever your file's mime type is
header("Content-Type: audio/mp3");
header("Content-Length: " . filesize($name));

fpassthru($fp);
exit;

?>

然后您可以访问:http://example.com/load.php?name=song.mp3来访问这些文件。至于您需要做什么检查,您可以通过查看$_SERVER['HTTP_REFERER']来检查引用者。您可以从player.php设置UUID或会话Cookie,然后在load.php中进行检查。

然后您可以使用以下内容拒绝访问您的文件:

RewriteEngine On
RewriteCond $1 !(player|load)\.php
RewriteRule ^songs/(.*)$ - [L,F]

拒绝访问任何不是player.php或load.php

的内容