You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel动态配置子域名与普通URL指向同一控制器的技术问询

实现Laravel中同一页面支持子域名与路径两种访问方式

1. 服务器配置(以Nginx为例)

先确保泛域名(*.domain.com)已解析到你的服务器IP,再配置Nginx将子域名请求转发到Laravel应用根目录:

server {
    listen 80;
    listen [::]:80;
    server_name domain.com *.domain.com;
    root /var/www/your-laravel-app/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;
    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # 根据你的PHP版本调整
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

如果用HTTPS,需配置泛域名SSL证书(比如Let's Encrypt泛域名证书),并添加对应的443端口监听块。

2. Laravel路由配置

同时定义子域名路由和路径路由,指向同一个控制器方法:

// routes/web.php

// 子域名路由:匹配 {shop}.domain.com
Route::domain('{shop}.domain.com')->group(function () {
    Route::get('/', 'App\Http\Controllers\ShopController@show')->name('shop.subdomain');
});

// 路径路由:匹配 domain.com/{shop}
Route::get('/{shop}', 'App\Http\Controllers\ShopController@show')->name('shop.path');

3. 控制器逻辑

在控制器中统一处理两种路由的参数,返回同一页面:

// app/Http/Controllers/ShopController.php

namespace App\Http\Controllers;

use App\Models\Shop;

class ShopController extends Controller
{
    public function show($shop)
    {
        // 根据店铺标识(slug/ID)获取数据
        $shopData = Shop::where('slug', $shop)->firstOrFail();
        
        // 返回同一视图
        return view('shop.show', compact('shopData'));
    }
}

4. 跨域Session共享配置

让用户在子域名和主域名路径下共享Session,修改config/session.php中的domain配置:

// config/session.php
'domain' => '.domain.com', // 注意前面的点,匹配所有子域名

5. 动态生成URL

在视图或控制器中生成两种格式的链接时,可通过路由名称指定参数:

// 生成子域名链接
$subdomainLink = route('shop.subdomain', ['shop' => $shopData->slug], false);

// 生成路径链接
$pathLink = route('shop.path', ['shop' => $shopData->slug], false);

注意事项

  • 确保DNS配置了泛域名解析,将*.domain.com指向服务器IP;
  • SSL证书需支持泛域名,否则子域名HTTPS访问会报错;
  • 如果使用Apache,需配置VirtualHost支持泛域名,并开启mod_rewrite模块。

内容的提问来源于stack exchange,提问作者Brijesh Chauhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:38:26