如何使用 Apache 阻止访问子域的根文件?

如何使用 Apache 阻止访问子域的根文件?

我有一个子域名,其根目录下有 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也将被拒绝。

但是,如果AcceptPathInfoOnDefault,则将接受像 这样的路径/index.php/blah,并将导致解析文件php(实际上,任何具有接受 PATH_INFO 请求的处理程序的脚本都将以这种方式提供服务)。如果这不是您想要的,那么您可能需要禁用AcceptPathInfo,但这可能会导致 PHP 页面行为异常。更好的解决方案是明确拒绝根目录中的 php 文件(此配置片段应在上面的片段之后使用):

<LocationMatch "^/[^/]*\.php.*">
    Require all denied
</LocationMatch>

相关内容