【问题标题】:Using htaccess to block access to a subdomain and all files and folders under that subdomain使用 htaccess 阻止访问子域以及该子域下的所有文件和文件夹
【发布时间】:2022-11-26 09:58:45
【问题描述】:

我在我的 cPanel 主机上有一个主域和一个网站设置,还有一个带有自己独立网站的附加域:域名.comaddon.com

由于 cPanel 配置附加域的方式,可以通过主域访问附加域的网站:

  • addon.domain.com/

  • domain.com/addon/

我想做的是阻止主域对附加域网站的所有访问,包括其中包含的任何和所有文件或文件夹,因此:

  • 正在访问addon.com/anyfolder/anyfile.php有效,但是;
  • 正在访问addon.domain.com/anyfolder/anyfile.php 或者
  • 正在访问domain.com/addon/anyfolder/anyfile.php失败并出现 404 错误。

我在修改附加域的 htaccess 文件以实现此目的方面取得了一些成功,例如在附加域的 htaccess 中使用它:

RewriteEngine on
RedirectMatch 404 ^/addon/(.*)$

积木domain.com/addon/anyfolder/anyfile.php完美,显示 404 错误。

但是我尝试了各种方法来做同样的事情addon.domain.com虽然我通常可以让它在仅访问域时显示 404,但对于任何文件夹或文件(addon.domain.com/anyfolder/anyfile.php) 它仍然可以正常工作,我不知道如何使用 htaccess 来纠正这个问题。

例如:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^https?://(www\.)addon\.com
RewriteRule ^(.*)$ - [L,R=404]

这使得addon.domain.com显示所需的 404 错误,但是addon.domain.com/anyfolder/anyfile.php仍然可以正常工作。

这当然只是一个例子,我实际上已经搜索了一段时间并尝试了几种不同的重写条件,但没有成功获得所需的结果。另一个仅适用于域的示例:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?addon.domain.co.uk$ [NC]
RewriteRule ^(.*)$ - [L,R=404]

这又一次导致addon.domain.com显示所需的 404 错误,但是addon.domain.com/anyfolder/anyfile.php仍然有效。

我唯一能想到的另一件事是编辑主域的 DNS 区域并删除(或以某种方式破坏)子域的 A 记录。这当然会导致“找不到服务器”错误,这会产生预期的影响,但我无法想象这是一个明智的选择。

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite subdomain


    【解决方案1】:

    您应该使用子域根目录中.htaccess 文件顶部附近的 mod_rewrite 执行类似以下操作。

    我假设 addon.comwww.addon.com 都应该可以访问。

    例如:

    RewriteEngine On
    
    RewriteCond %{HTTP_HOST} !^(www.)?addon.com$
    RewriteRule ^ - [R=404]
    

    以上将阻止(提供 404 Not Found)任何请求不是对于addon.com(或www.addon.com)。 ! 前缀条件模式否定表达式。任何 URL 路径。

    使用 4xx 范围内的返回码时,不需要 L 标志。


    替代方法

    一种不使用 mod_rewrite 的替代方法,因此不一定会被子目录中的 .htaccess 文件覆盖:

    <If "%{HTTP_HOST} !~ /^(www.)?addon.com$/">
        Require all denied
    </If>
    

    这使用带有 mod_authz_core 的 Apache 表达式。

    以上将为任何不针对插件域的请求提供 403 Forbidden。


    看看你的规则...

    RewriteEngine on
    RedirectMatch 404 ^/addon/(.*)$
    

    RedirectMatch 是一个 mod_alias 指令。这与初始化 mod_rewrite 的 RewriteEngine 指令无关。

    RewriteCond %{HTTP_REFERER} !^https?://(www.)addon.com
    RewriteRule ^(.*)$ - [L,R=404]
    

    这使得 addon.domain.com 显示所需的 404 错误,但是 addon.domain.com/anyfolder/anyfile.php 仍然可以正常工作。

    这是检查 Referer 标头(您要访问的站点), 所以这不会有预期的结果。但是,addon.domain.com/anyfolder/anyfile.php 的请求仍应被此规则阻止。

    请注意,.htaccess 文件中指令的顺序可能很重要。任何阻塞指令应该靠近配置文件的顶部。

    另一个仅适用于域的示例:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^(www.)?addon.domain.com$ [NC]
    RewriteRule ^(.*)$ - [L,R=404]
    

    这再次导致addon.domain.com 显示所需的 404 错误,但 addon.domain.com/anyfolder/anyfile.php 仍然有效。

    这应该阻止addon.domain.com/anyfolder/anyfile.php(有或没有 www 子域)- 除非规则放在错误的位置并且与其他规则冲突,如上所述。

    请注意,您不一定需要只有一个规则。两个或多个规则有时可以像一个规则一样有效地执行工作。

    【讨论】:

    • 感谢您的输入。您的解决方案确实阻止了域 (addon.domain.com),但同样,如果我浏览到 addon.domain.com/blahblah,它会加载它。我不知道为什么这是如果它应该做我想做的事,目前该网站只托管一个 phpbb 论坛,所以也许它与此有关?此外,htaccess 文件中没有任何其他内容,除了 cpanel 生成的关于继承 php 处理程序和一些自定义错误页面的注释,所以我认为问题也与规则的顺序无关。
    • 忽略我之前的评论。这是phpbb的安装!我刚刚创建了一个包含空 index.html 文件的新文件夹,它抛出 404。我假设 phpbb 有它自己的 htaccess 文件,或类似的文件。我不知道。但是当你提到冲突时,我意识到如果 htaccess 进一步存在于目录结构中,它可能就是冲突。
    • @Rentums 如果子目录中有任何 .htaccess 文件也使用 mod_rewrite,那么这些文件将(默认情况下)完全覆盖父配置中的 mod_rewrite 指令。我已经用不使用 mod_rewrite 的替代解决方案更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-07-21
    • 2012-11-18
    • 2016-01-18
    • 2019-05-26
    • 1970-01-01
    • 2015-10-21
    • 2021-05-08
    • 1970-01-01
    相关资源
    最近更新 更多