![禁止除子文件夹中的脚本之外的所有内容](https://linux22.com/image/776049/%E7%A6%81%E6%AD%A2%E9%99%A4%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E7%9A%84%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9.png)
我想禁止进入特定域(例如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 更好。