我的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,就像我在我的例子中所做的那样。
感谢您的任何建议:)
答案 0 :(得分:1)
首先,你可以改变:
RewriteRule ^(.+)$ $1 [L]
要:
RewriteRule ^ - [L]
这意味着同样的事情。 -
可以用来表示不做任何更改,只需应用标志。
对于拒绝,你可以使用[F]
标志正确地返回403禁止,而不是200重写/deny
。像这样:
RewriteRule ^ - [F,L]
如果您仍希望返回/deny
的内容,请为403添加ErrorDocument
指令并将其指向该页面。
要在PHP中写入文件,您只需使用file_put_contents
而不是对fopen
,fwrite
和fclose
的这三次调用。请参阅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]