当我尝试限制文件访问以仅index.php
使用类似于下面链接中的答案时,我无法通过目录索引(例如“DIRECTORY/”和“DIRECTORY”)进行访问。
我希望能够执行以下操作并拒绝除目录中的文件之外的所有index.php
文件.htaccess
。
拒绝访问除 index.html apache 之外的所有文件
DIRECTORY/index.php?get1=val1
DIRECTORY/?get1=val1
DIRECTORY?get1=val1
答案1
为了允许 mod_dir 在请求裸目录时进行内部子请求DirectoryIndex
,您只需使文件匹配成为可选的,这样它也会匹配一个本质上为空的文件名。
例如:
Order allow,deny
Deny from all
<FilesMatch ^(index\.php)?$>
Allow from all
</FilesMatch>
这样就可以同时允许
DIRECTORY/index.php?get1=val1
- 和
DIRECTORY/?get1=val1
任何目录在哪里DIRECTORY
(包括文档根目录)。
但是,这不允许DIRECTORY?get1=val1
(目录名后没有斜杠)。严格来说,这是 Apache 上的无效 URL。通常,mod_dir 通过发出 301 重定向来附加尾部斜杠来“修复”URL。即,DIRECTORY?get1=val1
被外部重定向到DIRECTORY/?get1=val1
。不幸的是,上述授权指令阻止 mod_dir 进行此重定向。
如果你特别想允许DIRECTORY?get1=val1
(没有尾部斜杠),那么你可以这样做一切使用 mod_rewrite 代替 mod_authz_host (Apache 2.2)。例如,将上面的内容替换为以下内容:
RewriteEngine On
RewriteRule ^DIRECTORY/(?!index\.php|$) - [F]
这将阻止访问具体的 DIRECTORY
,但允许/DIRECTORY/index.php
和/DIRECTORY/
被访问。这不会对请求/DIRECTORY
(没有尾部斜杠)执行任何特殊操作,但在请求中执行得足够晚,以便 mod_dir 能够先介入并发出 301 重定向(如上所述)。
(?!index\.php|$)
是负面前瞻index.php
- 当或$
(URL 结尾)发生以下情况时即为成功不是匹配。即它匹配除index.php
和之外的所有内容没有什么。
参考:
答案2
如果你给出的链接不起作用,你可以做类似的事情
RewriteEngine on
RewriteRule ^DIRECTORY /DIRECTORY/index.php?get1=val1 [R=permanent,L]