防止通过ip地址访问文件 - apache 2.4

时间:2015-07-27 17:37:17

标签: apache apache2.4

之前我曾问过类似的问题 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配置实现这一点,htaccess对我来说不是解决方案。我需要以递归方式为www内的所有目录/文件实现此目的,因此指定确切的文件名和/或目录也不是解决方案。

由于

1 个答案:

答案 0 :(得分: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目录中。 根据需要命名文件,只有包含catchall vhost的文件应命名为000-catchall,因为它们将从/etc/apache2/sites-enabled目录按字母顺序读取。

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

a2dissite 000-default

如果需要,您可以启用新的catchall网站和其他VHost:

a2ensite 000-catchall

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

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