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

使用Certbot配置子域名后出现404 Not Found错误求助

问题排查:admin.c.com配置SSL后出现404错误

在Ubuntu服务器上用Nginx托管主站www.c.com,新增子域名admin.c.com,未配置SSL时HTTP访问正常。参照主域名流程用Certbot给admin.c.com配置SSL后,子域名出现404 Not Found错误。

尝试过删除重签证书、更换子域名名称,问题依旧。移除443端口及SSL相关配置后,admin.c.com的HTTP访问恢复正常,但保留SSL配置时,HTTP和HTTPS均无法正常访问。

Nginx配置文件

server {
    listen 80;
    server_name c.com www.c.com admin.c.com;
    return 301 https://$host$request_uri;
}

server {
        listen 80;
        listen [::]:80;
        root /var/www/website/_work/C/C/admin/dist;
        index index.html index.htm;
        server_name admin.c.com;
        #error_page 404 /index.html;
        location /* {
                root /var/www/website/_work/C/C/admin/dist;
                #root /var/www/html;
                #try_files $uri $uri/ /index.html;
                client_max_body_size 200M;
        }

        listen [::]:443 ssl;
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/admin.c.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/admin.c.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
        listen 80;
        listen [::]:80;

        root /var/www/website/_work/C/C/server/static;
        index index.html index.htm index.nginx-debian.html;

        server_name c.com www.c.com;

        location / {
                proxy_pass http://localhost:8080;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_read_timeout 90;
                proxy_redirect http://localhost:8080 https://www.c.com;

        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain; charset=utf-8';
            add_header 'Content-Length' 0;
            return 204;
        }
        if ($request_method = 'POST') {
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
        }
        if ($request_method = 'GET') {
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
        }
    }

    client_max_body_size 200M;
    listen [::]:443 ssl; #ipv6only=on;  managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/c.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/c.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

nginx配置检查输出

执行nginx -t得到:

nginx: [warn] conflicting server name "admin.c.com" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "c.com" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "www.c.com" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

问题分析与解决方案

核心问题1:80端口server_name冲突

第一个server块监听80端口并包含所有域名的301跳转,但后面又分别为admin.c.com和主域名配置了独立的80端口server块,导致Nginx出现域名冲突警告。实际生效的是第一个server块(Nginx优先匹配先加载的配置),所以HTTP请求会被强制跳转到HTTPS,但HTTPS的admin.c.com配置存在路由规则错误。

核心问题2:admin.c.com的HTTPS配置路由规则错误

当前admin.c.com的HTTPS块中,location /*写法不符合Nginx规范,且未启用try_files规则,导致Nginx无法正确匹配静态文件路径,返回404。

修复后的配置

步骤1:清理80端口冲突配置

保留统一的80跳转块,删除其他server块的80监听配置,避免冲突:

# 统一处理所有HTTP请求跳转到HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name c.com www.c.com admin.c.com;
    return 301 https://$host$request_uri;
}

# admin.c.com的HTTPS配置
server {
        listen [::]:443 ssl;
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/admin.c.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/admin.c.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

        root /var/www/website/_work/C/C/admin/dist;
        index index.html index.htm;
        server_name admin.c.com;

        # 修复location规则,处理静态文件和单页应用路由
        location / {
                try_files $uri $uri/ /index.html;
                client_max_body_size 200M;
        }
}

# 主域名的HTTPS配置
server {
        listen [::]:443 ssl; #ipv6only=on;  managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/c.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/c.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

        root /var/www/website/_work/C/C/server/static;
        index index.html index.htm index.nginx-debian.html;
        server_name c.com www.c.com;

        location / {
                proxy_pass http://localhost:8080;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_read_timeout 90;
                proxy_redirect http://localhost:8080 https://www.c.com;

                if ($request_method = 'OPTIONS') {
                    add_header 'Access-Control-Allow-Origin' '*';
                    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
                    add_header 'Access-Control-Max-Age' 1728000;
                    add_header 'Content-Type' 'text/plain; charset=utf-8';
                    add_header 'Content-Length' 0;
                    return 204;
                }
                if ($request_method = 'POST') {
                    add_header 'Access-Control-Allow-Origin' '*' always;
                    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
                    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
                }
                if ($request_method = 'GET') {
                    add_header 'Access-Control-Allow-Origin' '*' always;
                    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
                    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
                }
        }

        client_max_body_size 200M;
}

验证步骤

  1. 执行nginx -t检查配置语法,确保无冲突警告
  2. 重启Nginx:systemctl reload nginx
  3. 访问https://admin.c.com验证是否正常加载
  4. 访问http://admin.c.com验证是否自动跳转到HTTPS

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:40:02