【问题标题】:Prevent access to files through ip address - apache 2.4防止通过 ip 地址访问文件 - apache 2.4
【发布时间】:2015-10-18 00:39:56
【问题描述】:

我之前也问过类似的问题 Restrict access to directories through ip address

当时 apache 2.2 的问题已经解决。最近我重新安装了操作系统(到 Debian 8),它带有 apache 2.4。

我想限制对文件的访问 - 当请求来自“通过”IP 时。主要是如果在浏览器中我尝试打开 http://192.168.252.178/test/image.jpg 它应该显示错误 - 403 被禁止。目录test 位于apache 的www 目录中。但是,如果我输入 http://www.example.com/image.jpg,我应该能够访问该图像 - 考虑到 example.com 指向该 test 目录。

使用 apache 2.2 版,我只需将这些行放在我的默认站点配置文件中 - 问题就解决了

<Files ~ ".+">
  Order allow,deny
  Deny from all
</Files>

现在,尝试同样的事情是行不通的:即使我尝试使用域名打开任何网站,我也会收到 403 禁止。

考虑到 2.4 中的更改,我也尝试了这个,但在尝试打开某些站点时再次获得相同的 403 禁止。

<Files ~ ".+">
       Require all denied
</Files>

我的目标是防止对目录和文件的任何形式的访问——如果它们是通过 IP 地址访问的。我在默认站点的配置中也有这行,以防止目录访问,这工作正常。

<Directory /home/username/www>
        Options -Indexes
        AllowOverride All
        Require all granted
</Directory>

所以,问题是 - 如何防止通过 IP 地址访问文件。我还需要通过 apache config 来实现这一点,htaccess 对我来说不是一个解决方案。我需要递归地为www 中的所有目录/文件实现这一点,因此指定确切的文件名和/或目录也不是解决方案。

谢谢

【问题讨论】:

  • 您使用的是 Apache 的 name based VirtualHosts 吗?在我看来,它们非常适合解决您的问题:每个站点一个 VHost(site1site2,...)和一个捕获所有其他请求的“catchall”,因此对 IP 的请求地址也。您可以为每个站点定义不同的 DocRoot,并非常轻松地关闭对 IP 地址的所有请求。
  • @Zimmi,感谢您的评论,是的,实际上我每个 ip 有多个域,但是您能否发布一个示例来说明您的意思?谢谢

标签: apache apache2.4


【解决方案1】:

当您使用基于名称的虚拟主机时,主服务器会消失。 Apache 会先根据 IP 地址(你可能有多个)和端口来选择要使用的虚拟主机,只有在第一次选择之后,它才会在这个候选子集中搜索相应的 ServerName 或 ServerAlias,按照顺序虚拟主机出现在配置中。

如果没有找到虚拟主机,则选择该子集中的第一个 VHost(也按配置顺序)。 More

我提到这一点是因为只有一种类型的 VirtualHost 指令很重要:

<VirutalHost *:80>

<VirtualHost 123.45.67.89:80>

我将在示例中使用通配符。 你需要一个像 /var/www/catchall 这样的目录,里面有一个 index.html 或类似的文件,你喜欢。

<VirtualHost *:80>
    # This first-listed virtual host is also the default for *:80
    # It will be used as the catchall.

    ServerName 123.45.67.89

    # Giving this DocRoot will avoid any request based on IP or any other
    # wrong request to get to the other users directories.

    DocumentRoot "/var/www/catchall"

    <Directory /var/www/catchall>
        ...
    </Directory>
</VirtualHost>

# Now you can add as usuall the configuration for any other VHost you need.
<VirtualHost *:80>
    ServerName site1.com
    ServerAlias www.site2.com

    DocumentRoot "/home/username1/www"
    <Directory /home/username1/www>
        ...
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName site2.com
    ServerAlias www.site2.com

    DocumentRoot "/home/username2/www"
    <Directory /home/username2/www>
        ...
    </Directory>
</VirtualHost>

Debian 特定:

对于 Debian,您最好为每个文件放置一个 VHost 配置,并将文件放在 /etc/apache2/sites-available 目录中。 随意命名文件,只有包含包罗万象的虚拟主机的文件应命名为000-catchall,因为它们将从/etc/apache2/sites-enabled 目录按字母顺序读取。

然后你禁用 Debian 通常的默认站点:

a2dissite 000-default

如果需要,您可以启用新的包罗万象的网站和其他 VHost:

a2ensite 000-catchall

ls /etc/apache2/sites-enabled 命令应将总括显示为列表的第一个,如果不更改其文件名,则它始终是第一个。重启 Apache:service apache2 restart

当然,您可以在原始默认 VHost 配置文件中进行所有这些更改,但我通常更喜欢保留原始模型。

【讨论】:

  • 有没有办法做到这一点,而无需明确告知ServerName 123.45.67.89 中的 IP 地址?这个 ip 可能会不时更改,我总是需要更改通用配置。
  • @Gustavo 答案的第二段解释了如何选择虚拟主机,也请参阅那里的链接。如果 Apache 基于 ServerName/ServerAlias 没有找到任何对应的 VirtualHost,它会从配置中选择第一个 VHost。所以你的包罗万象的 VHost 必须是配置中的第一个,因此名称为 000-catchall。那么包罗万象的服务器名称就不再重要了。也应该可以使用您机器的主机名,例如ServerName myserver 或其他任何名称,您可以对其进行测试
  • 我现在明白了。你介意看看这个question吗?
猜你喜欢
  • 2014-12-16
  • 2021-10-04
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
相关资源
最近更新 更多