You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改/etc/hosts导致Apache服务器配置块无法匹配

解决Apache访问example.com返回404但www.example.com正常的问题

我之前也遇到过类似的情况——修改主机名和hosts文件后,Apache的虚拟主机匹配逻辑出了问题,导致裸域名(example.com)的请求没命中对应的配置块,反而落到了默认虚拟主机返回404,而www子域名正常。咱们一步步排查解决:

1. 先修复/etc/hosts的格式问题

你给出的hosts内容格式明显不对,每行只能对应一个IP,后面跟主机名和别名,不能把多个IP和域名堆在一行。正确的写法应该是这样(替换成你的真实公网IP):

127.0.0.1 localhost
192.168.1.100 example.com www.example.com  # 这里换成你的VPS真实IP

如果是本地测试用,也可以用127.0.1.1(Ubuntu默认的本地主机名解析IP):

127.0.0.1 localhost
127.0.1.1 example.com www.example.com

注意:绝对不能用256.256.256.256这种无效IP,这会导致域名解析异常。修改后保存文件,重启网络服务让配置生效:

sudo systemctl restart systemd-networkd

2. 确认Apache虚拟主机配置已启用且正确

首先检查example.com的配置文件是否已经被Apache启用:

sudo a2ensite example.com.conf

如果已经启用,会提示Site example.com already enabled;如果没启用,这条命令会帮你启用它。

接下来打开/etc/apache2/sites-available/example.com.conf,确认ServerName和重定向规则是否正确。你的配置应该类似这样(确保裸域名的请求能匹配到):

<VirtualHost *:80>
    ServerName example.com
    # 可选:如果需要也可以把www加在这里当别名,但如果是分开配置的话就不用
    # ServerAlias www.example.com

    # 重定向到www版本的规则
    RewriteEngine On
    RewriteRule ^(.*)$ https://www.example.com$1 [R=301,L]
</VirtualHost>

如果你的www.example.com是单独的配置文件,那它的ServerName应该是www.example.com,确保两个配置的域名不冲突。

3. 检查虚拟主机加载顺序

Apache会按照/etc/apache2/sites-enabled/里的文件名顺序加载虚拟主机,文件名越靠前(比如以000开头)优先级越高。如果默认虚拟主机(000-default.conf)排在example.com.conf前面,可能会导致裸域名的请求被默认主机接管。

你可以先查看启用的虚拟主机顺序:

ls -l /etc/apache2/sites-enabled/

如果000-default.conf在前面,你可以禁用它(如果不需要默认主机的话):

sudo a2dissite 000-default.conf

或者把example.com.conf重命名为001-example.com.conf,让它优先加载:

sudo mv /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-available/001-example.com.conf
sudo a2ensite 001-example.com.conf

4. 重启Apache并清除缓存

修改所有配置后,必须重启Apache让更改生效:

sudo systemctl restart apache2

然后用curl测试(避免浏览器缓存干扰):

curl -I example.com

如果返回HTTP/1.1 301 Moved Permanently并且Location指向https://www.example.com,说明配置已经生效了。如果还是有问题,也可以清除本地DNS缓存(比如Ubuntu上用sudo systemd-resolve --flush-caches)。

5. 验证主机名和FQDN设置

最后确认你的VPS主机名已经正确设置为FQDN:

hostname

应该返回example.com。如果不是,重新设置:

sudo hostnamectl set-hostname example.com

同时检查/etc/hostname文件内容是否也是example.com,确保主机名配置一致。


内容的提问来源于stack exchange,提问作者armadadrive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:05:40