我知道有这样的成千上万的问题,但我似乎无法为我的问题找到合适的解决方案。
我正在尝试编写下载脚本。文件夹结构如下:
这是我的.htaccess文件:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^(.*?)$ index.php?file=$1 [QSA,L]
我想将每个请求重定向到index.php作为参数:
files.domain.com/awesomefile.zip -> files.domain.com/index.php?file=awesomefile.zip
这可以按预期工作,但如果我输入http://files.domain.com/__admin
或http://files.domain.com/admin
(不带斜线),则会分别将http://files.domain.com/__admin/?file=__admin
重写为http://files.domain.com/admin/?file=admin
(与其他现有目录相同) )。我知道mod_dir可能是罪魁祸首,但在.htaccess中设置DirectorySlashes off
并没有任何效果。
admin
(即使它不是目录)?编辑:我很抱歉让人感到困惑,这里有一些例子可以更好地描述我的意思:
用户类型:http://files.domain.com/file.zip
用户看到:http://files.domain.com/file.zip
内部重定向:http://files.domain.com/index.php?file=file.zip
这是理想的行为。
用户类型:http://files.domain.com/admin/
(请注意尾随斜杠)
用户看到:http://files.domain.com/admin/
内部重定向:http://files.domain.com/index.php?file=admin/
用户类型:http://files.domain.com/admin
用户看到:http://files.domain.com/admin/?file=admin
< - 为什么?
内部重定向:http://files.domain.com/index.php?file=admin
最后一个例子显示了我的问题。我想摆脱用户不应该看到的查询字符串!
答案 0 :(得分:2)
如果URI与目录名匹配,那么mod_dir
将添加尾部斜杠是正确的。因此,您有一个像/__admin
这样的URI,它会被重写为/__admin/
,因为有一个名称的目录。您可以控制此行为。
您可以通过DirectorySlash
指令
DirectorySlash Off
在重写规则之前放置它。
这仍然无法解释您添加斜杠的/admin
示例。我会质疑这是否可以重现。
请注意与关闭DirectorySlash相关的安全警告。您可能会引入一个安全漏洞。
答案 1 :(得分:1)
您的规则设置为每个请求都将定向到索引页面,这意味着对子文件夹的请求也会受到影响,您可以在规则中指定需要从规则中忽略哪些文件,如下所示:
RewriteCond %{REQUEST_URI} !^(/index\.php|_admin)