我有一台运行 Apache 2.2.15 的 CentOS 服务器。如果服务器的 IP 地址是192.0.2.231
,并且我在浏览器中写入,http://192.0.2.231/
它就会出现在我的网站上。
我想防止这种情况发生。我希望我的网站只能通过 FQDN 访问,即http://example.com/。
我该如何配置我的服务器,以便当我访问该 IP 地址时该网站无法访问?
答案1
您可以使用Alias *
它来捕获虚拟主机中允许的任何其他流量,为此您必须使用在最后的位置*
具有别名的虚拟主机。
就像这样,只有定义的域才会被提供服务。
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/default
...
</VirtualHost>
<VirtualHost *:80>
ServerName another.example.com
DocumentRoot /var/www/another
...
</VirtualHost>
# /!\ THIS HAS TO BE ON THE LAST POSITION /!\
<VirtualHost *:80 *:443>
# [ Server Domain ]
ServerName localhost
ServerAlias *
# [ Cancel trafic ]
RewriteRule .* - [END,R=406]
# [ Custom Log ]
CustomLog ${APACHE_LOG_DIR}/other.log combined
</VirtualHost>
在我的示例中,只有example.com
被another.example.com
允许,所有其他域或 IP 的流量都将被取消。
要取消流量,您可以使用重定向到-
,然后添加错误代码,例如我使用 RewriteRule 重定向到406 Not Acceptable
(R=406
)。
您可以在此处找到重定向代码列表: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
答案2
您可以添加默认虚拟主机,该主机只会给出“拒绝”错误或其他错误。当浏览器访问您的 Web 服务器时,如果 URL 中没有与其他虚拟主机中的任何ServerName
或ServerAlias
行匹配的主机,则将由默认虚拟主机提供服务。
因此在你的 apache 配置中:
<VirtualHost *:80>
ServerName default
DocumentRoot /var/www/default
...
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
...
</VirtualHost>
答案3
您需要这样的重写规则:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^mywebsite.com$
RewriteRule /.* https://mywebsite.com/ [R]
答案4
这不是 Apache 解决方案,但如果您的目标只是防止通过 IP 访问您的网站,那么一个简单的方法是在您的 Web 框架设置(例如ALLOWED_HOSTS
在 Django 或AllowedHosts
.NET 中)中设置允许的主机以仅包含您的域名。