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

.htaccess protect download private files from user's directory using php

我的 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 ^(.+)$    [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 ^(.+)$    [L]

RewriteRule .+  /deny   [L]

当用户登录时,会在用户的 tmp 目录中创建一个新的会话 ID 文件:

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

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

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

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

一个不错的选择是在 /users 目录中只使用一个 .htaccess,而不是像我在示例中那样为每个用户使用多个 .htaccess。

感谢任何建议:)

首先,你可以改变:

RewriteRule ^(.+)$  [L]

收件人:

RewriteRule ^ - [L]

意思是一样的。 - 可以用来表示不要进行任何更改,只需应用标志。

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

RewriteRule ^ - [F,L]

如果您仍希望 /deny 的内容被 return 编辑,则为 403 添加一个 ErrorDocument 指令并将其指向该页面。

要写入 PHP 中的文件,您可以只使用 file_put_contents 而不是对 fopenfwritefclose 的三个调用。参见 the documentation

回答你的实际问题,对于当前目录,你不能直接从RewriteCond变量中获取它,但是你可以在用[=44=生成它时将它写入文件中].

这是一个包含其他建议更改的示例:

$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]