我有一个名为users的目录,其中包含每个用户的子目录。例如。我的目录结构可能如下所示:
users/ .htaccess UserAccess.php foo/ baz.txt bar/ passwd.txt
我想阻止用户访问其他用户文件。因此,我写了一个php脚本,它检查路径并打印文件内容。问题是脚本没有运行,而是apache试图直接访问文件。
用户/目录中我的.htaccess是:
RewriteEngine on RewriteRule ^users/ UserAccess.php
然后,用户将尝试访问http://mywebsite.com/users/username/file
。例如。 http://mywebsite.com/users/foo/baz.txt
。
关键是http://mywebsite.com/users/username/
是一个REAL目录。
如何解决这个问题以实现我的目标?
编辑:
RewriteEngine on RewriteRule . UserAccess.php
也不起作用。
答案 0 :(得分:2)
如果您的网址类似于http://example.com/users/...
添加:
RewriteCond %{REQUEST_FILENAME} -f
应该让它发挥作用。
我在计算机上设置了以下.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^testdir readHTACCESS.php
它运作得很好......
答案 1 :(得分:1)
要阻止直接访问,您可以对Deny from all
以外的所有文件使用UserAccess.php
。
答案 2 :(得分:1)
我猜你需要使用mod_rewrite选项 看看here
答案 3 :(得分:1)
我假设mod_rewrite在你的服务器上运行并运行,我们正在处理的是如何使用它。 : - )
我建议你指定UserAccess.php的显式路径。你知道重写规则的“工作目录”是什么吗?
RewriteRule ^/users/ /users/UserAccess.php
我已经测试了这个,它对我有用。如果它不适合你,那么可能存在配置问题,而不仅仅是重写规则。如果是这种情况,那么知道你在access.log和error.log中看到的内容会非常有帮助。
您也可以通过将文件名作为变量提供来简化PHP中发生的事情:
RewriteRule ^/users/(.+\.txt) /users/UserAccess.php?what=$1
这样,您可以跳过解析$ _SERVER ['REQUEST_URI']并在使用readfile()或者等效的方式发送文件之前测试文件是否存在。
答案 4 :(得分:0)
答案是子文件夹(示例中的foo)具有权限700.这在解析重写规则之前引起了403响应。我将权限更改为701,一切正常。