[英]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.