Nginx访问IP跳转虚拟主机而非默认根目录问题求助
看起来你遇到的核心问题是Nginx没有正确将无Host头的请求(即直接访问IP)路由到你设置的默认/var/www目录,而是跳到了某个虚拟主机。我们一步步来排查和解决:
首先修复配置中的明显错误
先看你提供的default配置,这里有个无效的重复配置:
location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/run/php/php7.0-fpm.sock; }
fastcgi_pass写了两行,Nginx只会生效最后一行(unix sock那行),建议删掉第一行fastcgi_pass 127.0.0.1:9000;,避免配置混乱。
确保default_server标记唯一且生效
Nginx处理无Host头的请求时,会优先选择标记了default_server的server块——不管配置文件的加载顺序。所以你需要:
- 检查所有
/etc/nginx/sites-enabled/下的虚拟主机配置,确保只有你的default配置里有这两行:
如果其他虚拟主机配置里也有listen 80 default_server; listen [::]:80 default_server;default_server标记,全部删掉,只保留默认配置的。 - 验证配置文件语法:
如果输出sudo nginx -ttest is successful,再重新加载配置:sudo nginx -s reload
检查Nginx实际加载的配置
有时候看起来配置没问题,但实际加载的内容可能和预期不符。用以下命令查看Nginx加载的所有完整配置:
sudo nginx -T
搜索default_server,确认只有你的默认server块带有这个标记;同时检查各个server块的listen端口和server_name,确保没有其他server块的server_name匹配你的IP地址(比如server_name <你的IP>;)。
用curl测试,排除浏览器缓存干扰
你提到切换HTTPS后出现异常,这很可能是浏览器缓存了之前的请求或跳转。用curl直接测试IP访问,避免浏览器缓存影响:
curl -v http://<你的IP地址>/
查看输出中的Host头(应该是你的IP或者空),以及Nginx返回的Location或内容路径,确认请求是否路由到了/var/www。
排查配置加载顺序的潜在问题
如果上述步骤都没问题,但还是跳错虚拟主机,可能是某个虚拟主机的配置文件名在字母顺序上排在default前面,且该配置的server块没有指定server_name(相当于匹配所有Host头)。虽然default_server优先级更高,但如果这个配置的listen没有指定default_server,理论上不会抢请求,但可以尝试:
- 将
default配置的文件名改为000-default,让它在字母顺序上最先被加载,确保Nginx优先处理它的规则。
最后验证默认目录权限
确保/var/www目录的权限Nginx能读取:
sudo chown -R www-data:www-data /var/www sudo chmod -R 755 /var/www
按照这些步骤排查后,应该就能让直接访问IP的请求正确路由到/var/www目录了。
内容的提问来源于stack exchange,提问作者Titus

