繁体   English   中英

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

[英]How can I use an htaccess rewrite rule to redirect away from an existing file?

我有一个名为用户的目录,其中包含每个用户的子目录。 例如,我的目录结构可能类似于:

users/
    .htaccess
    UserAccess.php
    foo/
        baz.txt
    bar/
        passwd.txt

我想防止用户访问其他用户文件。 因此,我写了一个php脚本来检查路径并打印文件内容。 问题在于该脚本未在运行,而是apache尝试直接访问文件。

我的users。目录中的.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

也不起作用。

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

RewriteCond %{REQUEST_FILENAME} -f

应该使它工作。

我在计算机上使用以下.htaccess设置了示例

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

而且效果很好...

链接

为了防止直接访问,您可以对UserAccess.php以外的所有文件Deny from all使用Deny from all

我猜你需要使用mod_rewrite的选项看看这里

我假设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()或equiv发送文件之前测试文件是否存在。

答案是子文件夹(示例中为foo)具有权限700。这在解析重写规则之前引起了403响应。 我将权限更改为701,一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM