.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
而不是对 fopen
、fwrite
和 fclose
的三个调用。参见 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]
我的 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
而不是对 fopen
、fwrite
和 fclose
的三个调用。参见 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]