让 Apache 服务器只接受对域名的请求而不是对 IP 的请求

让 Apache 服务器只接受对域名的请求而不是对 IP 的请求

我有一台运行 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.comanother.example.com允许,所有其他域或 IP 的流量都将被取消。

要取消流量,您可以使用重定向到-,然后添加错误代码,例如我使用 RewriteRule 重定向到406 Not AcceptableR=406)。

您可以在此处找到重定向代码列表: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

答案2

您可以添加默认虚拟主机,该主机只会给出“拒绝”错误或其他错误。当浏览器访问您的 Web 服务器时,如果 URL 中没有与其他虚拟主机中的任何ServerNameServerAlias行匹配的主机,则将由默认虚拟主机提供服务。

因此在你的 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 中)中设置允许的主机以仅包含您的域名。

相关内容