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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:54:01