使用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; }
验证步骤
- 执行
nginx -t检查配置语法,确保无冲突警告 - 重启Nginx:
systemctl reload nginx - 访问
https://admin.c.com验证是否正常加载 - 访问
http://admin.c.com验证是否自动跳转到HTTPS
内容的提问来源于stack exchange,提问作者triangulum66
相关产品推荐
相关产品推荐

