禁止除子文件夹中的脚本之外的所有内容

禁止除子文件夹中的脚本之外的所有内容

我想禁止进入特定域(例如example.com)的所有内容,除了位于特定路径(例如example.com/subfolder1/subfolder2/script.php)上的一些入口点(这里是 PHP 文件)。

这是我在虚拟主机中针对此特定域使用的配置片段。我仍然对所有内容都得到 403。

就上下文而言,我使用的是 Apache 2.4.41 + FPM 7.2

<VirtualHost *:443>
  ServerName example.com
  DocumentRoot /my/path
  <Directory /my/path>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/subfolder1/subfolder2$
    RewriteRule . - [F,L]
  </Directory>
</VirtualHost>

答案1

RewriteCond %{REQUEST_URI} !^/subfolder1/subfolder2$
RewriteRule . - [F,L]

由于字符串结尾锚点 ( $),这仅允许/subfolder1/subfolder2完全(不/subfolder1/subfolder2/script.php)并阻止其他所有内容。由于/subfolder1/subfolder2可能是物理目录,因此 mod_dir 将重定向以附加尾部斜杠,然后该斜杠将被此规则阻止。所以是的,它确实阻止了一切

您需要$条件模式。 例如:

RewriteCond %{REQUEST_URI} !^/subfolder1/subfolder2

subfolder2但严格来说,为了避免与任何可能以(例如)开头的内容发生冲突,subfolder2foo.php那么您应该使用类似的正则表达式^/subfolder1/subfolder2($|/)

请注意,如果这是您需要允许的唯一 URL 路径,则不需要状况,因为测试应该RewriteRule直接在指令中执行。例如:

RewriteRule !^/subfolder1/subfolder2($|/) - [F]

L标志不是必须的F;它是隐含的。


或者,根本不要使用 mod_rewrite。例如:

  <Directory /my/path>
    Require all denied
  </Directory>
  <Directory /my/path/subfolder1/subfolder2>
    Require all granted
  </Directory>

除非您有其他要求,否则这比 mod_rewrite 更好。

相关内容