Codeigniter子域名重定向至指定控制器实现方案咨询
嘿,这个需求其实挺常见的,核心就是解析子域名并根据不同子域名转发到对应控制器,我给你分几种常见的技术场景来拆解,你可以根据自己用的技术栈来选:
一、用Web服务器直接配置转发(Nginx/Apache)
这种方式适合不需要后端额外处理逻辑的场景,直接在服务器层面完成跳转,性能也更高。
Nginx 配置方案
在你的Nginx站点配置文件里添加以下规则:
server { listen 80; # 匹配所有子域名和主域名 server_name *.mysite.com mysite.com; # 处理www子域名,转发到main_controller if ($host = www.mysite.com) { # 把根路径和后续路径都重写到main_controller下 rewrite ^/(.*)$ /main_controller/$1 last; } # 匹配abc、stack、test这三个子域名,转发到sub_controller if ($host ~* ^(abc|stack|test)\.mysite\.com$) { rewrite ^/(.*)$ /sub_controller/$1 last; } # 其他请求保持原路径(比如www.mysite.com/other_controller直接映射到原控制器) location / { # 这里替换成你实际的后端地址,比如PHP-FPM或者反向代理到应用服务器 proxy_pass http://your-backend-server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
小贴士:Nginx里的
if虽然常被吐槽,但这种简单的域名判断场景是安全的,不用担心性能问题。
Apache .htaccess 配置方案
如果用Apache,确保开启了mod_rewrite模块,然后在项目根目录的.htaccess里添加:
RewriteEngine On # 处理www子域名,转发到main_controller RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] RewriteRule ^(.*)$ /main_controller/$1 [L] # 处理abc、stack、test子域名,转发到sub_controller RewriteCond %{HTTP_HOST} ^(abc|stack|test)\.mysite\.com$ [NC] RewriteRule ^(.*)$ /sub_controller/$1 [L] # 保留原有的静态文件和目录访问规则 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 这里是你原本的路由入口,比如PHP项目指向index.php RewriteRule ^(.*)$ index.php/$1 [L]
解释:
[NC]表示不区分大小写,[L]表示匹配到这条规则后就停止后续规则解析。
二、后端框架路由层处理(以Laravel为例)
如果你的项目用了后端框架,直接在路由层处理会更灵活,还能结合业务逻辑做定制。比如Laravel的配置:
在routes/web.php里添加域名分组路由:
// www子域名的所有请求都路由到MainController Route::domain('www.mysite.com')->group(function () { // 根路径指向MainController的index方法 Route::get('/', 'MainController@index'); // 其他任意路径都转发到MainController的handle方法(可根据需求调整) Route::any('/{path?}', 'MainController@handle')->where('path', '.*'); }); // abc、stack、test这三个子域名的请求路由到SubController Route::domain(['abc.mysite.com', 'stack.mysite.com', 'test.mysite.com'])->group(function () { Route::get('/', 'SubController@index'); Route::any('/{path?}', 'SubController@handle')->where('path', '.*'); }); // 其他路径(比如/other_controller)保持原路由规则 Route::get('/other_controller', 'OtherController@index');
要是你用的是Node.js(比如Express)、Python(比如Django)框架,思路类似:先获取请求的主机名,判断子域名,再路由到对应控制器。
三、必须注意的前置条件
- DNS解析:先确保所有子域名(www、abc、stack、test)都解析到你的服务器IP,最好用通配符解析
*.mysite.com,这样后续新增子域名不用改DNS。 - HTTPS证书:如果用HTTPS,要申请通配符SSL证书
*.mysite.com,不然浏览器会提示证书错误。 - 后端获取子域名:如果需要在控制器里知道当前访问的是哪个子域名,可以通过
$_SERVER['HTTP_HOST'](PHP)、req.headers.host(Express)或者框架提供的工具方法来获取,方便做更个性化的逻辑。
这样配置后,就能完全满足你的需求啦~
内容的提问来源于stack exchange,提问作者user3030909
相关产品推荐
相关产品推荐

