Laravel Forge负载均衡器默认兜底站点失效问题求助
解决Laravel Forge兜底站点失效问题
问题核心
恢复站点SSL证书后,未配置的域名请求不再被000-catch-all兜底站点处理,而是跳转到站点列表的第一个站点,原因主要有两点:
- Nginx会将未匹配
server_name的请求交给第一个加载的server块处理,若兜底配置加载顺序靠后则失效 - 兜底配置仅处理HTTP(80端口)请求,未覆盖HTTPS(443端口),导致HTTPS的未匹配请求被第一个HTTPS站点接管
解决方案
1. 确保兜底配置优先加载
Nginx按配置文件名排序加载站点配置,000-catch-all的前缀保证它会被优先加载,但需确认:
- 执行
ls -l /etc/nginx/sites-enabled/,确认000-catch-all排在所有站点配置的最前面 - 若顺序不对,调整文件名前缀(比如用
000-开头,确保比其他站点的数字前缀更小)
2. 更新兜底配置,覆盖HTTP和HTTPS请求
修改000-catch-all配置,添加HTTPS监听并设置为default_server,同时配置有效SSL证书(可使用Let's Encrypt泛域名证书,或Forge生成的默认证书):
# HTTP 请求处理:可重定向到HTTPS兜底,或直接返回页面 server { listen 80 default_server; listen [::]:80 default_server; server_name _; # 可选:将HTTP请求重定向到HTTPS兜底 return 301 https://$host$request_uri; # 若无需跳转,直接返回兜底页面 # root /home/forge/catch-all; # index index.html index.htm; # location / {} } # HTTPS 请求兜底处理 server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name _; # 替换为你的有效SSL证书路径 ssl_certificate /etc/nginx/ssl/catch-all.example.com/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/catch-all.example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; root /home/forge/catch-all; index index.html index.htm; error_page 404 /404.html; location / {} }
3. 移除其他站点的default_server配置
检查所有站点的Nginx配置,确保它们的listen指令没有添加default_server参数(比如你提供的站点配置中listen 80;是正确的,没有加default_server),避免覆盖兜底配置的默认规则。
4. 验证配置并重启Nginx
- 执行
sudo nginx -t检查配置语法是否合法 - 执行
sudo systemctl reload nginx重启Nginx生效配置
5. 负载均衡额外检查(若使用)
如果负载均衡做了SSL终止,确保它将未匹配域名的请求转发到后端的兜底站点,而非直接转发到第一个站点。
内容的提问来源于stack exchange,提问作者cbloss793
相关产品推荐
相关产品推荐

