我有一个子域名,其根目录下有 index.php。我想要阻止对https://SUB.example.com/index.php
任何其他顶级文件的访问,同时允许任何拥有完整 URL 的人访问文件(例如该子域名子文件夹中的另一个 index.php)
我想在我的虚拟主机配置下而不是 .htaccess 下执行此操作,因为另一个子域使用了相同的文件夹。
我在 Debian Buster 下使用 Apache 2.4
答案1
有多种方法可以限制对某个路径的访问,但这里有一个示例:
利用<Location>
标签。例如:
<VirtualHost "*:80">
DocumentRoot "/path/to/blah"
ServerName blah.blah.blah
<Location "/somepath">
Require all denied
</Location>
</VirtualHost>
如果您想向客户端指出更多信息,您也可以使用Redirect
位置中的选项:
Redirect 403 /somepath /some-nice-message.html
答案2
使用LocationMatch
指令,它允许指定正则表达式作为位置,如下所示:
<VirtualHost *:80>
ServerName your.server.name
(...)
<LocationMatch "^/[^/]*">
Require all denied
</LocationMatch>
</VirtualHost>
这将阻止所有以 开头/
但不包含任何/
符号的访问,因此 webroot 中的任何内容都将被阻止,但该路径下的任何路径都将被允许。参数不被视为路径的一部分,因此调用/index.php?/blah
也将被拒绝。
但是,如果AcceptPathInfo
是On
或Default
,则将接受像 这样的路径/index.php/blah
,并将导致解析文件php
(实际上,任何具有接受 PATH_INFO 请求的处理程序的脚本都将以这种方式提供服务)。如果这不是您想要的,那么您可能需要禁用AcceptPathInfo
,但这可能会导致 PHP 页面行为异常。更好的解决方案是明确拒绝根目录中的 php 文件(此配置片段应在上面的片段之后使用):
<LocationMatch "^/[^/]*\.php.*">
Require all denied
</LocationMatch>