如何使用htaccess重写规则重定向现有文件?

时间:2011-12-09 15:02:16

标签: php apache

我有一个名为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

也不起作用。

5 个答案:

答案 0 :(得分:2)

如果您的网址类似于http://example.com/users/...添加:

RewriteCond %{REQUEST_FILENAME} -f

应该让它发挥作用。

我在计算机上设置了以下.htaccess

的示例
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^testdir readHTACCESS.php

它运作得很好......

LINK

答案 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,一切正常。