Nginx配置疑难:添加default_server致子域名异常,移除则报SSL证书错误
解决Nginx配置中default_server与子域名冲突及SSL证书报错问题
我来帮你拆解这个问题并给出针对性的解决方案:
问题根源分析
加
default_server后子域名显示主站内容:
当你把default_server加到www.fastenglishacademy.fr的443 server块时,所有没有匹配到对应server块的HTTPS请求(比如api.fastenglishacademy.fr)都会被这个默认服务器接管,自然就会显示主站的内容。移除
default_server后出现SSL证书报错:
Nginx有个硬性要求:所有带有listen ... ssl指令的server块,必须配置ssl_certificate和ssl_certificate_key。你的第一个443 server块(处理fastenglishacademy.fr的HTTPS跳转)只做了301跳转,没有配置SSL证书;而当没有指定default_server时,Nginx会把第一个出现的443 server块当作默认服务器,检查到它缺少SSL配置就会直接报错。
解决方案:配置独立默认HTTPS服务器 + 子域名专属server块
我们可以通过两步彻底解决这个矛盾:
- 创建一个专门的默认HTTPS服务器,处理所有未匹配到具体域名的请求,同时给它配置SSL证书;
- 为
api.fastenglishacademy.fr配置单独的server块,避免它被默认服务器或主站server块处理。
修改后的完整配置如下:
# 合并HTTP跳转规则,简化配置 server { listen 80; listen [::]:80; server_name fastenglishacademy.fr www.fastenglishacademy.fr; return 301 https://www.fastenglishacademy.fr$request_uri; } # 处理主域名HTTPS跳转(必须配置SSL证书) server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name fastenglishacademy.fr; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; return 301 https://www.fastenglishacademy.fr$request_uri; } # 专门的默认HTTPS服务器,处理未匹配的请求 server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; # 对未匹配的域名,直接关闭连接(也可以返回自定义404页面) return 444; } # 主站核心server块 server { listen 443 ssl http2; listen [::]:443 ssl http2; root /media/fea/www/fastenglishacademy.com; index index.html index.htm index.nginx-debian.html; server_name www.fastenglishacademy.fr; location / { etag on; try_files $uri$args $uri$args/ /index.html; } location ~* \.(jpg|jpeg|png|gif|ico|ttf|woff2|woff|svg)$ { expires 365d; } location ~* \.(css|js)$ { expires 30d; } location ~* \.(pdf)$ { expires 15d; } add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; ssl_trusted_certificate /path/to/chain.pem; } # api子域名专属server块(根据实际需求配置) server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name api.fastenglishacademy.fr; # 示例:如果是反向代理到后端API服务 # location / { # proxy_pass http://localhost:3000; # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # } ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; ssl_trusted_certificate /path/to/chain.pem; }
关键细节说明
- 给跳转的443块加证书:哪怕只是做跳转,只要
listen指令带ssl,就必须配置SSL证书,否则Nginx无法完成SSL握手流程。 - 独立默认服务器:把
default_server放到专门的块里,主站和子域名的请求会优先匹配各自的server块,只有完全未匹配的请求才会被默认服务器处理。 - 子域名专属块:为
api.fastenglishacademy.fr单独配置server块,确保它的请求不会被主站或默认服务器接管。
配置完成后,执行nginx -t测试配置合法性,没问题的话重启Nginx即可生效。
内容的提问来源于stack exchange,提问作者Ahsan Aasim
相关产品推荐
相关产品推荐

