.htaccess使用php保护用户目录下载私有文件

时间:2017-06-11 19:57:30

标签: php .htaccess mod-rewrite httpcookie

我的php脚本创建了一个用户存储私人文件的目录,我需要将其保密,除了所有者。

基本上我的结构是这样的:

- root/
- storage/
---- users/
----------user1/
---------------.htaccess
---------------images/
---------------tmp/
-------------------session-id-file
----------user2/
---------------.htaccess
---------------images/
---------------tmp/
-------------------session-id-file

这意味着当新用户注册时,在/ storage / users中创建新用户的目录:

$dir = __DIR__ . "/storage/user/" . $user["id"]; mkdir($dir);

然后在里面创建一个新的.htaccess:

 $myfile = fopen($file, "w") or die("Unable to create file!");
 $txt = "RewriteCond %{HTTP_COOKIE}        PHPSESSID=(\w+)\n
 **RewriteCond {CURRENT-DIRECTORY}/tmp/access-%1      -f \n**
 RewriteRule ^(.+)$  $1  [L]\n
 RewriteRule .+  /deny   [L]\n";
 fwrite($myfile, $txt);
 fclose($myfile);

.htaccess显示为:

RewriteCond %{HTTP_COOKIE}        PHPSESSID=(\w+)
RewriteCond {CURRENT-DIRECTORY}/tmp/access-%1      -f
RewriteRule ^(.+)$  $1  [L]

RewriteRule .+  /deny   [L]

当用户登录时,会在用户的tmp目录中创建一个新的session-id-file:

touch($dir . "/tmp/" . session_id());

我的问题是:如何检测htaccess所在的{current directory}?基本上如何修复.htaccess中的错误行:

        RewriteCond {CURRENT-DIRECTORYY}}/tmp/access-%1      -f \n

我见过类似的问题,但我无法根据动态创建的目录检测当前目录。

一个好的选择可能是只使用一个.htaccess到/ users目录而不是每个用户的许多.htaccess,就像我在我的例子中所做的那样。

感谢您的任何建议:)

1 个答案:

答案 0 :(得分:1)

首先,你可以改变:

RewriteRule ^(.+)$ $1 [L]

要:

RewriteRule ^ - [L]

这意味着同样的事情。 -可以用来表示不做任何更改,只需应用标志。

对于拒绝,你可以使用[F]标志正确地返回403禁止,而不是200重写/deny。像这样:

RewriteRule ^ - [F,L]

如果您仍希望返回/deny的内容,请为403添加ErrorDocument指令并将其指向该页面。

要在PHP中写入文件,您只需使用file_put_contents而不是对fopenfwritefclose的这三次调用。请参阅the documentation

要回答您的实际问题,对于当前目录,您无法直接从RewriteCond变量获取它,但您可以在使用PHP生成文件时将其写入文件。

以下是其他建议更改的示例:

$txt = "RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)\n
RewriteCond $dir/tmp/access-%1 -f\n
RewriteRule ^ - [L]\n
RewriteRule ^ - [F,L]\n";
file_put_contents($myfile, $txt) or die("Unable to create file!");

所以它变成了,例如:

RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)
RewriteCond /root/storage/users/userid/tmp/access-%1 -f
RewriteRule ^ - [L]
RewriteRule ^ - [F,L]