Nginx 域名解析后默认打开其他项目问题解决方案

1. 问题背景

在 Linux 服务器中完成域名解析后,未配置对应 Nginx 跳转规则时,访问该域名会默认打开服务器中已存在的其他项目。后续补充配置 HTTP(80 端口)默认服务器返回 404 后,HTTP 访问问题解决,但 HTTPS(443 端口)访问仍会跳转至其他项目。

2. 问题核心原因

Nginx 接收请求时会按优先级匹配 server 块,未匹配到对应域名的 server 块时,会使用默认 server 块处理请求,具体分两种场景:

  1. 未显式配置 default_server 时,Nginx 会将配置中第一个加载server 块作为默认,导致未配置域名的请求被该默认 server 对应的项目处理;

  2. 仅配置了 HTTP(80 端口)的默认 server 块,未配置 HTTPS(443 端口)的默认 server 块时,HTTPS 请求会匹配 443 端口下第一个加载的 server 块,从而跳转至其他项目(Nginx 处理 HTTPS 请求需配套 SSL 配置,否则无法正常响应)。

3. 前置排查步骤

3.1 确认是否存在显式默认服务器

执行以下命令检查 Nginx 配置中是否存在 default_server 配置:

bash 复制代码
nginx -T | grep -n "default_server"

若仅返回配置语法正常提示,无其他匹配内容,则说明未显式配置默认服务器。

3.2 定位当前默认 server 块

执行以下命令筛选所有 server 块的核心配置,定位默认匹配的项目:

bash 复制代码
nginx -T | grep -E -A 5 -B 5 "server_name|root " | grep -v "#"

输出结果中最先出现的 server块,即为当前默认服务器,其 root 字段对应的目录就是访问未配置域名时打开的项目目录。

4. 解决方案

核心思路:为新域名配置独立 server 块,并补充 HTTP(80 端口)和 HTTPS(443 端口)的默认 server 块,确保未配置域名的请求统一返回 404 或关闭连接。

4.1 为新域名配置独立 server 块

4.1.1 创建虚拟主机配置目录

为便于管理,在 Nginx 配置目录下新建 vhost 文件夹存放虚拟主机配置:

bash 复制代码
mkdir -p /usr/local/nginx/conf/vhost

4.1.2 新建新域名配置文件

bash 复制代码
vim /usr/local/nginx/conf/vhost/your-domain.conf

写入以下配置(替换 your-domain.com 为实际域名,/usr/local/nginx/html/your-project 为实际项目根目录):

nginx 复制代码
# 新域名独立 server 块
server {
    listen 80;
    server_name your-domain.com www.your-domain.com;  # 配置目标域名

    root /usr/local/nginx/html/your-project;  # 项目根目录
    index index.html index.htm index.php;  # 默认索引文件

    # 基础路由配置
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 日志配置(便于排查问题)
    access_log /usr/local/nginx/logs/your-domain_access.log;
    error_log /usr/local/nginx/logs/your-domain_error.log;
}

4.1.3 加载虚拟主机配置

编辑 Nginx 主配置文件,在 http 块末尾添加虚拟主机配置加载指令:

bash 复制代码
vim /usr/local/nginx/conf/nginx.conf
nginx 复制代码
# 加载虚拟主机配置(添加至 http 块末尾)
include /usr/local/nginx/conf/vhost/*.conf;

4.2 配置 HTTP + HTTPS 默认 server 块

4.2.1 新建默认服务器配置文件

bash 复制代码
vim /usr/local/nginx/conf/vhost/default.conf

写入以下配置,同时覆盖 HTTP 和 HTTPS 未配置域名的请求:

nginx 复制代码
# 处理 HTTP (80 端口) 未配置域名
server {
    listen 80 default_server;  # 标记为 80 端口默认服务器
    server_name _;  # 匹配所有未配置域名

    return 404 "Domain not configured (HTTP)";  # 返回 404 提示
}

# 处理 HTTPS (443 端口) 未配置域名
server {
    listen 443 ssl http2 default_server;  # 标记为 443 端口默认服务器
    server_name _;  # 匹配所有未配置域名

    # SSL 证书配置(自签名或正规证书均可)
    ssl_certificate /usr/local/nginx/conf/ssl/default.crt;  # 证书路径
    ssl_certificate_key /usr/local/nginx/conf/ssl/default.key;  # 私钥路径

    # 基础 SSL 协议配置(必填,避免 Nginx 启动报错)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    return 404 "Domain not configured (HTTPS)";  # 返回 404 提示
    # 可选:直接关闭连接(更安全,无任何响应)
    # return 444;
}

4.2.2 生成自签名 SSL 证书(若无可信证书)

若服务器无现成 SSL 证书,可通过以下命令生成自签名证书(浏览器会提示不安全,但不影响功能):

bash 复制代码
# 1. 创建证书存放目录
mkdir -p /usr/local/nginx/conf/ssl

# 2. 生成自签名证书(一路回车即可,无需额外填写信息)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout /usr/local/nginx/conf/ssl/default.key \
  -out /usr/local/nginx/conf/ssl/default.crt

4.3 验证配置并重启 Nginx

bash 复制代码
# 检查配置语法是否正确
/usr/local/nginx/sbin/nginx -t

# 重载 Nginx 配置(使配置生效)
/usr/local/nginx/sbin/nginx -s reload

5. 验证步骤

  1. 访问新配置的域名(http://your-domain.comhttps://your-domain.com),应正常加载对应项目;

  2. 访问未配置的任意域名(已解析至服务器),HTTP 和 HTTPS 均应返回 404 提示(或无响应,若配置 return 444);

  3. (可选)执行以下命令确认默认服务器配置生效: /usr/local/nginx/sbin/nginx -T | grep -E "listen 80 default_server|listen 443 default_server" | grep -v "#" 输出应包含 80 端口和 443 端口的 default_server 配置。

6. 注意事项

  1. Nginx 配置文件加载顺序由文件名字母顺序决定,建议默认服务器配置文件命名为 default.conf(确保优先加载,避免被其他配置覆盖);

  2. 修改 Nginx 配置前,建议备份原有配置文件(如 cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak),避免配置错误导致服务异常;

  3. 自签名证书仅用于功能验证,若需消除浏览器"不安全"提示,需为默认服务器配置正规 SSL 证书(如 Let's Encrypt 免费证书);

  4. 执行 Nginx 相关命令时,需确保拥有对应目录的读写权限(建议使用 root 用户操作)。

7. 相关命令汇总

bash 复制代码
# 1. 检查 Nginx 配置语法
/usr/local/nginx/sbin/nginx -t

# 2. 重载 Nginx 配置
/usr/local/nginx/sbin/nginx -s reload

# 3. 查看默认服务器配置
nginx -T | grep -n "default_server"

# 4. 定位默认 server 块核心配置
nginx -T | grep -E -A 5 -B 5 "server_name|root " | grep -v "#"

# 5. 生成自签名 SSL 证书
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /usr/local/nginx/conf/ssl/default.key -out /usr/local/nginx/conf/ssl/default.crt

# 6. 重命名文件(用于临时禁用配置)
mv /usr/local/nginx/conf/vhost/xxx.conf /usr/local/nginx/conf/vhost/xxx.conf.bak
相关推荐
取谖慕12.2 小时前
keepailved+nginx+nfs高可用
运维·nginx·nfs
小Ti客栈3 小时前
Nginx进阶配置实战全攻略:SSL部署、防盗链、压缩、代理、限流、请求合并
nginx·负载均衡·ssl
岁岁种桃花儿5 小时前
深入理解 Keepalive:从协议到 Nginx 实战(全场景解析)
运维·nginx
康小庄5 小时前
通过NGINX实现将小程序HTTPS请求转为内部HTTP请求
java·spring boot·nginx·spring·http·小程序
牵牛老人6 小时前
Qt后端开发遇到跨域问题终极解决方案 与 Nginx反向代理全解析
qt·nginx·状态模式
小目标一个亿17 小时前
Windows平台Nginx配置web账号密码验证
linux·前端·nginx
养乐多q.♡1 天前
docker镜像的nginx配置证书SSL,单独配置单个localtion使用证书,其他nginx配置不影响
nginx·docker·ssl
Java水解1 天前
Nginx 配置文件完全指南
后端·nginx
firstacui1 天前
Keepalived+nginx+tomcat
nginx·tomcat·firefox