- 重复:防止搜索引擎将 IP 地址和域名当作两个不同的网站进行索引,导致内容重复。
- 提升安全性:可以减少自动化扫描器和恶意机器人直接通过 IP 发现并攻击你的服务器的机会。
- 避免不必要的带宽消耗:防止有人直接通过 IP 访问你的服务器,消耗不必要的资源。
- 规范访问入口:强制所有用户都通过你设定的域名来访问网站。
下面我将为你介绍几种最常用和最有效的方法,从推荐到备选排列。

使用 ServerName 和 ServerAlias(推荐方法)
这是最标准、最推荐的方法,它通过为你的虚拟主机(Virtual Host)明确指定域名,并让 Apache 默认的 first VirtualHost 捕获所有未匹配的 IP 请求,然后将它们重定向到你的主域名。
工作原理:
Apache 会按照配置文件中的顺序来匹配虚拟主机,当一个请求到达时,它会依次检查每个 <VirtualHost> 的 ServerName 和 ServerAlias,如果没有找到匹配的,它就会使用配置文件中 第一个 定义好的 <VirtualHost> 来处理这个请求。
我们可以创建一个特殊的、默认的虚拟主机,专门用来处理所有通过 IP 地址的访问。
操作步骤:
-
找到你的虚拟主机配置文件 通常位于
/etc/apache2/sites-available/(Debian/Ubuntu) 或/etc/httpd/conf.d/(CentOS/RHEL) 目录下,你的网站配置文件可能叫做000-default.conf,default.conf或your-domain.conf。
(图片来源网络,侵删) -
备份原配置文件 在修改之前,请务必备份你的现有配置。
sudo cp /etc/apache2/sites-available/your-domain.conf /etc/apache2/sites-available/your-domain.conf.bak
-
编辑配置文件 我们将创建一个新的、位于最前面的默认主机配置。
对于 Debian/Ubuntu (使用
sites-available目录):a. 创建一个新的默认主机配置文件,
default-ip.conf:
(图片来源网络,侵删)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 访问者自动跳转到你的网站,可以使用
RewriteRule。R=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 的目录有效。
操作步骤:
-
进入你的网站根目录
cd /var/www/html/your-site/
-
创建或编辑
.htaccess文件sudo nano .htaccess
-
添加以下规则
# 检查 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 错误。
- 解释:
-
确保 Apache 允许使用
.htaccess在你的虚拟主机配置文件中,确保Directory指令包含了AllowOverride All或AllowOverride 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 服务器,它有自己管理虚拟主机的方式,直接编辑配置文件可能会被覆盖。
- 登录到 WHM (Web Host Manager)。
- 进入 Apache Configuration。
- 选择 Include Editor。
- 在 Pre VirtualHost Include 下的文本框中,添加以下内容:
<VirtualHost 0.0.0.0:80> ServerName your-domain.com # 替换为你的主域名 ServerAlias www.your-domain.com <Location /> Require all denied </Location> </VirtualHost> - 点击 Update 按钮,cPanel 会自动重新构建 Apache 配置并重启服务。
验证设置
设置完成后,你需要验证是否生效。
-
直接在浏览器地址栏输入你的服务器 IP 地址。
- 如果设置了
Require all denied,你应该会看到 "403 Forbidden" 错误页面。 - 如果设置了重定向,浏览器应该会自动跳转到
http://your-domain.com。
- 如果设置了
-
使用
curl命令行工具进行测试:curl -I http://YOUR_SERVER_IP
如果成功禁止,你会
