拒绝访问除 index.php 之外的所有文件,但允许通过 htaccess 文件中的“/”进行访问

拒绝访问除 index.php 之外的所有文件,但允许通过 htaccess 文件中的“/”进行访问

当我尝试限制文件访问以仅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]

相关内容