我想禁止进入特定域(例如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 更好。