之前我曾问过类似的问题 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
内的所有目录/文件实现此目的,因此指定确切的文件名和/或目录也不是解决方案。
由于
答案 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配置文件中进行所有这些更改,但我通常更喜欢保留原始模型。