CentOS下Nginx将所有子域名重定向至根域名失败求助
我来帮你搞定这个子域名重定向的问题!结合你用CentOS+Nginx+Puma的场景,这种配置后失效的情况,大概率是Nginx的server块匹配规则或者配置顺序出了问题,咱们一步步来调整:
可能的问题点&解决方案
1. 调整Server块的匹配顺序与规则
Nginx是按匹配优先级处理请求的,你需要把主域名的精确匹配server块放在前面,再用一个default_server的兜底块来处理所有子域名。给你一个适配Puma的正确配置示例:
# 主域名配置(精确匹配,优先处理) server { listen 80; server_name mydomein.com www.mydomein.com; # 不需要保留www的话,只留主域名即可 # 反向代理到Puma的核心配置 location / { proxy_pass http://127.0.0.1:3000; # 替换成你的Puma实际监听端口 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; } # 静态文件直接由Nginx处理(如果你的应用有静态资源的话) location ~* ^/assets/ { expires 1y; add_header Cache-Control public; add_header ETag ""; break; } } # 兜底子域名重定向块 server { listen 80 default_server; server_name *.mydomein.com; # 301永久重定向到主域名,保留原请求路径 return 301 http://mydomein.com$request_uri; }
这里的关键是default_server标记,它会让所有未匹配到主域名的请求(也就是所有子域名)都进入这个块执行重定向。
2. 确认DNS解析是否正确
你得确保*.mydomein.com这个泛域名已经指向了你的服务器IP,如果DNS没配置对,Nginx根本收不到子域名的请求,自然会跳转到默认页面。
3. 验证配置并重启Nginx
每次改完配置后,一定要先检查语法是否合法:
nginx -t
如果输出nginx: configuration file /etc/nginx/nginx.conf test is successful,再重启Nginx生效:
systemctl restart nginx
要是之前配置有语法错误,Nginx会停留在旧配置上,新规则自然不生效。
4. 检查Puma与日志排查
- 确保Puma的监听地址是Nginx能访问到的(比如
127.0.0.1:3000),不要绑定到特定外部IP导致Nginx连不上。 - 如果还是有问题,去看Nginx的日志找线索:
- 访问日志:
/var/log/nginx/access.log,看子域名请求到底匹配到了哪个server块 - 错误日志:
/var/log/nginx/error.log,有没有报错信息(比如proxy_pass失败、配置语法问题)
- 访问日志:
5. 测试重定向效果
用curl命令快速验证:
curl -I http://任意子域名.mydomein.com
如果返回的响应头里有Location: http://mydomein.com/原路径,说明重定向已经生效了。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

