【问题标题】:.htaccess protect download private files from user's directory using php.htaccess 使用 php 保护从用户目录下载私有文件
【发布时间】:2017-06-11 19:57:29
【问题描述】:

我的 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 所在的{当前目录}?基本上如何修复.htaccess中的错误行:

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

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

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

感谢您的任何建议:)

【问题讨论】:

  • 您要拒绝所有访问/存储/用户吗?我理解对了吗?
  • 是的。楼主除外。我使用 session_id 文件和 cookie 检测所有者。

标签: php .htaccess mod-rewrite httpcookie


【解决方案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]

【讨论】:

  • 谢谢!好点子!我有另一个错误,因为条件: RewriteCond /httpdocs/storage/user/1/tmp/access-%1 -f 不正确,但文件存在。嗯,我检查了,值 %1 是正确的(并且会话文件存在于路径中)。
  • 也许仔细检查该路径?它与您上面指定的路径结构不同,可能是您的路径有错误。 /user/1 而不是 /users/user1
  • 除此之外,请确保 Apache 有权访问该路径,并查看在您的主 Apache 配置中设置 LogLevel rewrite:trace3(或更高级别的跟踪,最多 8 个)以查看出现了什么问题遵守规则。
  • 不,它是正确的。我通过FTP验证了它。 ftp.*******.com//httpdocs/storage/user/11/tmp/4ie3ac4nlv4unl14uovnomb0r4 并在 htaccess 上使用了“/httpdocs/storage/user/11/tmp/%1”。同时我验证了 htaccess 得到了正确的 php session id。
  • 我可以在浏览器上看到会话 id 文件(从路径中删除 httdpocs,它是服务器上的根目录)。我尝试添加 .txt 但没有发生。明天我会检查 apache 配置,看看 LogLevel rewrite:trace3 是如何设置的。非常感谢帮助我:)
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多