1. 重复:防止搜索引擎将 IP 地址和域名当作两个不同的网站进行索引,导致内容重复。
  2. 提升安全性:可以减少自动化扫描器和恶意机器人直接通过 IP 发现并攻击你的服务器的机会。
  3. 避免不必要的带宽消耗:防止有人直接通过 IP 访问你的服务器,消耗不必要的资源。
  4. 规范访问入口:强制所有用户都通过你设定的域名来访问网站。

下面我将为你介绍几种最常用和最有效的方法,从推荐到备选排列。

apache 禁止ip访问网站
(图片来源网络,侵删)

使用 ServerNameServerAlias(推荐方法)

这是最标准、最推荐的方法,它通过为你的虚拟主机(Virtual Host)明确指定域名,并让 Apache 默认的 first VirtualHost 捕获所有未匹配的 IP 请求,然后将它们重定向到你的主域名。

工作原理: Apache 会按照配置文件中的顺序来匹配虚拟主机,当一个请求到达时,它会依次检查每个 <VirtualHost>ServerNameServerAlias,如果没有找到匹配的,它就会使用配置文件中 第一个 定义好的 <VirtualHost> 来处理这个请求。

我们可以创建一个特殊的、默认的虚拟主机,专门用来处理所有通过 IP 地址的访问。

操作步骤:

  1. 找到你的虚拟主机配置文件 通常位于 /etc/apache2/sites-available/ (Debian/Ubuntu) 或 /etc/httpd/conf.d/ (CentOS/RHEL) 目录下,你的网站配置文件可能叫做 000-default.conf, default.confyour-domain.conf

    apache 禁止ip访问网站
    (图片来源网络,侵删)
  2. 备份原配置文件 在修改之前,请务必备份你的现有配置。

    sudo cp /etc/apache2/sites-available/your-domain.conf /etc/apache2/sites-available/your-domain.conf.bak
  3. 编辑配置文件 我们将创建一个新的、位于最前面的默认主机配置。

    对于 Debian/Ubuntu (使用 sites-available 目录):

    a. 创建一个新的默认主机配置文件,default-ip.conf

    apache 禁止ip访问网站
    (图片来源网络,侵删)
    sudo nano /etc/apache2/sites-available/default-ip.conf

    b. 在文件中填入以下内容,将 your-domain.com 替换成你的主域名:

    <VirtualHost *:80>
        # ServerAdmin webmaster@localhost
        # DocumentRoot /var/www/html  # 这一行可以注释掉或留空,因为我们不希望提供任何内容
        # 将所有通过 IP 的访问都重定向到主域名
        ServerName your-domain.com
        ServerAlias www.your-domain.com
        # 记录所有试图通过 IP 访问的日志
        ErrorLog ${APACHE_LOG_DIR}/ip_access.log
        CustomLog ${APACHE_LOG_DIR}/ip_access.log combined
        # 返回一个 403 Forbidden 错误,或者重定向到主域名
        # 方案 A: 直接禁止 (推荐)
        <Location />
            Require all denied
        </Location>
        # 方案 B: 重定向到主域名
        # RewriteEngine On
        # RewriteCond %{HTTP_HOST} !^your-domain.com [NC]
        # RewriteRule ^(.*)$ http://your-domain.com/$1 [L,R=301]
    </VirtualHost>
    • 解释:
      • ServerName your-domain.com: 这行是关键,它让这个虚拟主机成为一个“候选”。
      • Require all denied: 这是核心,它禁止所有对这个虚拟主机的访问,当一个 IP 请求进来时,因为没有匹配的 ServerName,Apache 会使用这个默认主机,然后因为这条规则,访问就会被拒绝,返回 403 Forbidden 错误。
      • 重定向方案: 如果你希望将 IP 访问者自动跳转到你的网站,可以使用 RewriteRuleR=301 表示永久重定向。

    c. 禁用默认的默认主机: 通常会有一个类似 000-default.conf 的文件,它定义了默认行为,我们需要禁用它,让我们的新配置生效。

    sudo a2dissite 000-default.conf

    d. 启用你的新配置

    sudo a2ensite default-ip.conf

    e. 重新加载 Apache 配置

    sudo systemctl reload apache2

    对于 CentOS/RHEL (直接在 conf.d 目录下):

    a. 编辑主配置文件,/etc/httpd/conf.d/your-domain.conf,将你的网站虚拟主机配置放在文件最顶部。

    b. 在这个配置文件的 最上面,添加一个专门用于 IP 访问的虚拟主机块:

    # 这个块必须放在其他所有虚拟主机配置之前
    <VirtualHost *:80>
        ServerName your-domain.com
        ServerAlias www.your-domain.com
        ErrorLog "logs/ip_access_log"
        CustomLog "logs/ip_access_log" combined
        <Location />
            Require all denied
        </Location>
    </VirtualHost>
    # --- 下面是你原来的网站虚拟主机配置 ---
    <VirtualHost *:80>
        ServerName your-domain.com
        ServerAlias www.your-domain.com
        DocumentRoot "/var/www/html/your-site"
        # ... 其他配置 ...
    </VirtualHost>

    c. 保存文件后,重新加载 Apache:

    sudo systemctl reload httpd

使用 .htaccess 文件(适用于特定网站)

如果你没有服务器的 root 权限,或者只想针对某一个特定的网站目录进行设置,可以使用 .htaccess 文件,这种方法不如方法一彻底,因为它只对设置了 AllowOverride All 的目录有效。

操作步骤:

  1. 进入你的网站根目录

    cd /var/www/html/your-site/
  2. 创建或编辑 .htaccess 文件

    sudo nano .htaccess
  3. 添加以下规则

    # 检查 HTTP_HOST 是否为 IP 地址
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(\d{1,3}\.){3}\d{1,3}$ [NC]
    RewriteRule .* - [F]  # F = Forbidden (返回403错误)
    • 解释:
      • RewriteEngine On: 开启重写引擎。
      • RewriteCond: 设置重写条件。%{HTTP_HOST} 是访问请求中的主机头。^(\d{1,3}\.){3}\d{1,3}$ 是一个正则表达式,用于匹配一个 IPv4 地址格式。
      • RewriteRule .* - [F]: 如果条件匹配,就执行一个操作。 匹配所有请求路径。 表示不进行重写。[F] 标志告诉 Apache 立即向客户端返回一个 403 Forbidden 错误。
  4. 确保 Apache 允许使用 .htaccess 在你的虚拟主机配置文件中,确保 Directory 指令包含了 AllowOverride AllAllowOverride FileInfo

    <Directory "/var/www/html/your-site">
        Options Indexes FollowSymLinks
        AllowOverride All # 确保这里是 All
        Require all granted
    </Directory>

    然后重新加载 Apache。

    sudo systemctl reload apache2

使用 default-server.conf(适用于 cPanel 环境)

如果你使用的是 cPanel 服务器,它有自己管理虚拟主机的方式,直接编辑配置文件可能会被覆盖。

  1. 登录到 WHM (Web Host Manager)
  2. 进入 Apache Configuration
  3. 选择 Include Editor
  4. Pre VirtualHost Include 下的文本框中,添加以下内容:
    <VirtualHost 0.0.0.0:80>
        ServerName your-domain.com # 替换为你的主域名
        ServerAlias www.your-domain.com
        <Location />
            Require all denied
        </Location>
    </VirtualHost>
  5. 点击 Update 按钮,cPanel 会自动重新构建 Apache 配置并重启服务。

验证设置

设置完成后,你需要验证是否生效。

  1. 直接在浏览器地址栏输入你的服务器 IP 地址

    • 如果设置了 Require all denied,你应该会看到 "403 Forbidden" 错误页面。
    • 如果设置了重定向,浏览器应该会自动跳转到 http://your-domain.com
  2. 使用 curl 命令行工具进行测试

    curl -I http://YOUR_SERVER_IP

    如果成功禁止,你会