除一个目录外,阻止php文件

时间:2019-05-30 17:51:45

标签: php regex .htaccess

除了一个特定的文件夹及其子文件夹,我正在尝试阻止所有对特定文件夹和子文件夹中的php文件的调用。

我尝试了多种不同的正则表达式排列,我可以使正则表达式正确匹配,这是在有问题的htaccess中实现的。

这是现在的htaccess文件:

<FilesMatch "\.(?i:php)$">
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
  </IfModule>
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
</FilesMatch>

这是在htaccess外部正确匹配的正则表达式:

^(?!.*(thedirectory)).*(?i:php)$

当我针对index.php检查该正则表达式时,它匹配。当我检查/thedirectory/index.php时,它不匹配。当我检查/someotherdirectory/style.css时,它不匹配。

我希望它如何工作:

domain.com/folder/index.php -> 404 Error
domain.com/folder/thedirectory/index.php -> resolves
domain.com/folder/someotherdirectory/index.php -> 404 Error
domain.com/folder/someotherdirectory/afunction.php -> 404 Error
domain.com/folder/someotherdirectory/style.css -> resolves

2 个答案:

答案 0 :(得分:1)

结果比我想的要简单得多:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_URI} ^(?!.*(thedirectory)).*(?i:php)$ [NC]
    RewriteRule "(.*)" /404.php
</IfModule>

答案 1 :(得分:0)

<Files><FilesMatch>部分仅匹配文件名,而不匹配目录路径。因此,尝试这样做自然会失败。

另一种方法是简单地在要允许访问的目录中创建一个额外的.htaccess文件,该文件将覆盖父文件:

Require all granted