如何在已创建的Laravel Forge站点添加通配符子域名?
如何在Laravel Forge已创建的站点添加通配符子域名?
嘿,我来帮你一步步解决这个问题!你遇到的访问报错和配置不生效的问题,其实可以拆成几个关键点来处理:
第一步:先搞定DNS解析(最关键!)
你访问app.mydomain.com时提示“server IP address could not be found”,这说明你的域名还没有配置通配符DNS记录——这是前提问题,Nginx配置再正确也没用。
- 登录你的域名注册商/ DNS服务商后台
- 添加一条通配符A记录:主机名填
*,值填你Laravel Forge服务器的公网IP - 或者添加CNAME记录:主机名
*,指向mydomain.com(如果主域名已经正确解析到服务器的话) - 等待DNS生效(通常几分钟到几小时不等,可以用
nslookup app.mydomain.com命令验证是否解析成功)
第二步:用Laravel Forge可视化操作(推荐,不用手动改配置)
Forge本身支持事后添加通配符域名,完全不用手动编辑Nginx配置,步骤简单还能保证配置规范:
- 登录Laravel Forge,找到你的目标站点
- 切换到「Site」标签页
- 在「Domain」区域,点击「Add Domain」按钮
- 输入
*.mydomain.com,然后保存 - 如果你的站点开启了Let's Encrypt,Forge会自动为通配符域名申请SSL证书(需要你按照提示添加对应的TXT记录完成DNS验证)
这样Forge会自动帮你更新Nginx配置、重启服务,全程不用碰配置文件。
第三步:如果非要手动修改Nginx配置(注意事项)
如果你坚持手动改配置,那你之前的配置有两个明显问题:
- 语法错误:
server_name ~^(.*)\.mydomain\.com$这一行末尾没有分号,Nginx会直接报错,导致配置不生效 - 写法冗余:正则表达式没必要,直接用通配符
*.mydomain.com更直观
修正后的Nginx server块应该是这样的:
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name mydomain.com *.mydomain.com; # 同时包含主域名和通配符子域名 root /home/forge/mydomain.com/public; # FORGE SSL (DO NOT REMOVE!) ssl_certificate /etc/nginx/ssl/mydomain.com/321141/server.crt; ssl_certificate_key /etc/nginx/ssl/mydomain.com/321141/server.key; # 剩下的配置... }
修改后必须做这两步:
- 先测试配置是否正确:
sudo nginx -t,只有显示test is successful才继续 - 重启Nginx服务:
sudo systemctl reload nginx
另外,如果你用了通配符子域名,需要确保SSL证书支持通配符——手动配置的话,你需要重新申请通配符SSL证书(比如用Certbot命令:certbot certonly --manual --preferred-challenges=dns -d mydomain.com -d *.mydomain.com),然后替换Nginx里的证书路径。
第四步:确保Laravel路由能处理子域名
既然你本地Valet没问题,服务器上也要确保路由配置正确。比如在routes/web.php里可以这样定义子域名路由:
Route::domain('{subdomain}.mydomain.com')->group(function () { // 这里写子域名对应的路由,比如: Route::get('/', function ($subdomain) { return "欢迎访问 {$subdomain}.mydomain.com"; }); });
或者根据请求的子域名做逻辑判断:
if (request()->route('subdomain') === 'app') { // 处理app子域名的专属逻辑 }
内容的提问来源于stack exchange,提问作者Packy
相关产品推荐
相关产品推荐

