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
相关产品推荐
相关产品推荐

